M@*bRB 2 "zjZJ:!"*$%DDiisskk DDeessccrriippttoorr3300 0000MM44б]]00]]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]]00xh X H8(p`!"P$%]]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́h6҅n< ؉tBލzH䑲NꕸT"𙾚Z(Ğ`.ʢf4ЦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6?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=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNʁf4Ѕl:։r@܍xF⑰~L蕶R X&ž^,Ȣd2ΦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN 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 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNN΁l:օtC߉{I捳S![)ǖc2Ϛm< ؞vDᢰ~LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNDKBT300 Z80 DKBT300 Z807 BBM103 Z80BBM103 Z800NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZMON107 Z80ZMON107 Z80=DKBT305 Z80DKBT305 Z80{NNNNNNNNNNNNNNNNNN B(NNNNNNNNNNNNNNNNNNNNNNDKBT307 Z80CDEFGHIJDKBT307 Z80'KLMDKBT304 Z80NOPQRSTUDKBT304 Z80VWXYZ[\]l&NNNNNNNNNNNNNNNNNNbTNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%gNNNNNNNNNNNNNNNNNNNNNNalibrate ; 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 NNNNNNNNNNNNNNNNN+hNNNNNNNNNNNNNNNNNNNNN!Also ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRINNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNBBM103 Z80 !"#$%BBM103 Z80W&'()*+ZMON108 Z80,-./0123ZMON108 Z80456789:;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZMON110 Z80ZMON110 Z80ZMON110 Z80OZMON111 Z80cNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNDKBT304 Z80^DKBT300AZ80_`abcdefDKBT300AZ80ighijklm-ZMON1XX 3gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&4NNNNNNNNNNNNNNNNNNNNNN GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1<NNNNNNNNNNNNNNNNN,wNNNNNNNNNNNNNNNNNNNNN!VE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; ; 3.0 - 10 FEB 86 GRH ; Change Jade DD boot to resident prom version. ; Implement diNNNNNNNNNNNNNNNNNNa'NNNNNNNNNNNNNNNNNNNNNNZMON108 Z80<<=>?ZMON109XZ80@ABCDEFGZMON109XZ80HIJKLMNOZMON109XZ80=PQRSrNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNZMON111 Z80ZMON111 Z80mCLOK102 Z80TCLOK100 Z80"@)NNNNNNNNNNNNNNNNNN$JNNNNNNNNNNNNNNNNNNNNNNZMON121 Z80nopqrstuZMON121 Z80vwxyz{|}ZMON121 Z80~ZMON121 Z80` NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; RNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN.6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out tNNNNNNNNNNNNNNNNN-DNNNNNNNNNNNNNNNNNNNNNNsk I/O driver functions & vectors. ; code drive ; 0x Jade #0 (40H) F0 ; 1x Jade #0 (40H) F1 ; 2x Jade #1 (41H) F0 ; 3xXHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNM5I100 Z80iTUVWXYZM5C100 Z802[\]^ZMON109 Z80_`abcdefZMON109 Z80ghijklmnNNNNNNNNNNNNNNNNN ۿNNNNNNNNNNNNNNNNNNNNNNCLOK101 Z80GDKBT201 Z80DKBT201 Z80DKBT308 Z80  vNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNZMON2 DOC!ZMONROM DEFZMON1-X Z80ZMON1-X Z80z|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNrjNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN"TNNNNNNNNNNNNNNNNNNNNNN ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**********************NNNNNNNNNNNNNNNNN(;NNNNNNNNNNNNNNNNNNNNNNhat if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit al\NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN! Jade #1 (41H) F1 ; 4x ISHA DRIVE 0 HEAD 0 ; 5x ISHA DRIVE 0 HEAD 2 ; 6x ISHA DRIVE 1 HEAD 0 ; 7x ISHA DRIVE 1 HEAD 2 ;JNNNNNNNNNNNNNNNNNˁNNNNNNNNNNNNNNNNNNNNNNZMON109 Z80=opqrZMON106 Z80stuvwxyzZMON106 Z80{|}~ZMON106 Z80=@NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDKBT308 Z80   DKBT308 Z80>DKBT306 Z80DKBT306 Z80 !"#$%& NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNZMON1-X Z80=DMOSS202ASMDMOSS202ASMDMOSS202ASME?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNA[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN#gNNNNNNNNNNNNNNNNNNNNNN****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. :NNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNong with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot optionn:NNNNNNNNNNNNNNNNNNN/"NNNNNNNNNNNNNNNNNNNNN! Add error message output. ; VERSN EQU '30' ; ;**************************************************************************** N/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ZMON105 Z80ZMON105 Z80ZMON105 Z807ZMON107 Z80gNNNNNNNNNNNNNNNNN qNNNNNNNNNNNNNNNNNNNNNNDKBT306 Z80<'()*DKBT303 Z80+,-./012DKBT303 Z80~3456789:DKBT307 Z80;<=>?@ABINNNNNNNNNNNNNNNNNNQeNNNNNNNNNNNNNNNNNNNNNNIOBOARD DEFINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$VNNNNNNNNNNNNNNNNNNNNNN; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6Ӆq@݉zI捳P Z(Ɩc1Κk:מtCࢯ}MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0uNNNNNNNNNNNNNNNNNNNNNN=========================================================================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSEZjNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!*INCLUDE NAKEDT.DEF ;*INCLUDE HDISK.DEF ; ;============================================================================ LISNNNNNNNNNNNNNNNNN uNNNNNNNNNNNNNNNNNNNNN!ROLLER PORT # ; ; BOOT VARIABLES ; ARGSAV DS 1 ;ARGUMENT SAVE BYTE BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS [NNNNNNNNNNNNNNNNNNNUdNNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- JP CO ;----------------------------------e?sNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN START OF 1ST VECTOR FOR USER ACCESS ; ;############################################################################ DB HIGHRNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!OR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;-------------@NNNNNNNNNNNNNNNNN%WNNNNNNNNNNNNNNNNNNNNNN 40H PAGE ADDRESS ; 41H= PORT 41H PAGE ADDRESS ; 42H= PORT 42H PAGE ADDRESS ; 43H= PORT 43H PAGE ADDRESS ; (0: NOT IN SYSTENNNNNNNNNNNNNNNNN+XNNNNNNNNNNNNNNNNNNNNNNOLLER BOOT ; SUBTTL JADE BOOT ;---------------------------------------------------------------------------- ; ; THIS ROU޳ߎNNNNNNNNNNNNNNNNNe&NNNNNNNNNNNNNNNNNNNNNN ; REV EQU 'C' ;JADE BOARD REVISION LEVEL ; BIOSSEC EQU 13 ;START SECTOR OF BIOS HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQ΍NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT OFF *INCLUDE MONBOARD.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE HDISKb-NNNNNNNNNNNNNNNNN KNNNNNNNNNNNNNNNNNNNNN!2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;---------------------------------------------------------------------------- NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------------------------------ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- BC= IOPB PTR ; E= 0: NO DATA XFER ;~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN VERSN,'.',LOW VERSN ;---------------------------------------------------------------------------- ; ; COLD START FROM RE1NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; EԦNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNM) ; LD HL,FDC0 ;INIT PORTS & ADDRESS LD B,ARGSAV - FDC0 IFD: LD (HL),0 INC HL DJNZ IFD ; LD BC,0440H ;START WITH NNNNNNNNNNNNNNNNN,@NNNNNNNNNNNNNNNNNNNNN!TINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM TH(|NNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNN!U 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBY EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN.DEF LIST ON ;============================================================================ ; ; PAGE 0 RESERVED AREA ; rNNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNN ; ; STAND-ALONE ENTRY VECTOR ; ;---------------------------------------------------------------------------- JP COLD ;BOeUNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;---------------------------------------------------------------------------- kSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;---------------------------------------------------------------------------- COLD:]NNNNNNNNNNNNNNNNN!6NNNNNNNNNNNNNNNNNNNNNNNTRY- C= ARGUMENTS: ; 7 0 ; |x| | | |x|x|x|x| ; ^ ^ ^__________ JADE CONTROLLER #1 DRIVE {0,1} ; | |__________'eNNNNNNNNNNNNNNNNNN'5NNNNNNNNNNNNNNNNNNNNN!PORT 40H FOR 4 PORTS LD HL,FDC0 IFD2: IN A,(C) ;GET BOARD STATUS INC A ;IF ALL 1S THEN NOT EXISTING JR Z,NOTHERE ; D*NNNNNNNNNNNNNNNNN-sNNNNNNNNNNNNNNNNNNNNNNE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;-----------------------------------------------------------------uNNNNNNNNNNNNNNNNNπNNNNNNNNNNNNNNNNNNNNNNEFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H XOVER EQU PROMST + 30H ZNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;============================================================================ ORG 0040H ; ; JADE CONTROLLER WINDOW PAGE ANNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNOT VECTOR ;---------------------------------------------------------------------------- ; ; CONSOLE INPUT ; EXIT - A= CHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!JP JADEX ;---------------------------------------------------------------------------- ; ; ISHA DRIVER VECTOR ; ENTRY- BNNNNNNNNNNNNNNNNNEZNNNNNNNNNNNNNNNNNNNNN! DI ;DISABLE ROM IMAGE OUT (COLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD C,0 ;SELECT OPTIONS JR BEGIN ;-----ulNNNNNNNNNNNNNNNNN"cNNNNNNNNNNNNNNNNNNNNN!__ JADE CONTROLLER #2 DRIVE {0,1} ; |______________ ISHA HARD DISK (BIT 4 & 5= LOGICAL DRIVE) ; BHARDB EQU 2 ;ISHA HARD DINNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNEC A AND DDSASW ;COMPUTE BOARD ADDR RLCA OR DDBASE SHR 8 LD (HL),A ;STORE ADDRESS OF PORT NOTHERE: INC HL ;NEXT PONNNNNNNNNNNNNNNNN.&NNNNNNNNNNNNNNNNNNNNNN----------- ; ; COMPUTE THE PORT # ; LD A,(ARGSAV) ;PORT ADDRESS = 40H + (DRIVE# MOD 2) SRL A ADD A,40H CP A,44H ;mNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;ROM CROSS-OVER POINT PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;============================================}NNNNNNNNNNNNNNNNN ߾NNNNNNNNNNNNNNNNNNNNNNDDRESSES (0: NON-EXISTENT) ; FDC0 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 40H FDC1 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 41H FqNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNAR ; ;---------------------------------------------------------------------------- RET NOP NOP DS 3 ;RESERVE SPACE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNC= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;----------------------------------------------------------------- @NNNNNNNNNNNNNNNNvkNNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLER ; ;---------------NNNNNNNNNNNNNNNNN#PNNNNNNNNNNNNNNNNNNNNNNSK BIT # ;---------------------------------------------------------------------------- BEGIN: ; ; SAVE ARGUMENT ; LD A,NNNNNNNNNNNNNNNNN):NNNNNNNNNNNNNNNNNNNNNNRT INC C DJNZ IFD2 ; ; NOW VECTOR TO DISK BOOT ROUTINE ; LD A,(ARGSAV) AND 0F0H RRCA RRCA RRCA RRCA BIT BNyNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNIF PORT NOT {40H..43H} THEN ABORT JR NC,ABORT ; LD C,A ; ; RESET & START THE DISK PROCESSOR ; LD A,DDBGN CALL JWAI|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN================================ ; ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;6NNNNNNNNNNNNNNNNNN F)NNNNNNNNNNNNNNNNNNNNNNDC2 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 42H FDC3 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 43H ; FDCPRT DS 1 ;CURRENT JADE CONTWNNNNNNNNNNNNNNNNNfUNNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN----------- JP ISHAX ;############################################################################ ; ; PUT VERSION # AT7~NNNNNNNNNNNNNNNNN#8NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------- DS XOVER - $ ;POSITION CODE DKRET: LD A,XMONROM ;SELECT MONIT\WNNNNNNNNNNNNNNNNN$fNNNNNNNNNNNNNNNNNNNNN!C ;CHECK OPTIONS LD (ARGSAV),A ; SAVE ARGS ; ; SET UP CONTROLLER TABLE AT 40H ; TABLE IS ARRANGED AS FOLLOWS: ; 40H= PORT)NNNNNNNNNNNNNNNNN*iNNNNNNNNNNNNNNNNNNNNN!HARDB,A ;TEST FOR HARD DISK RES BHARDB,A ;CLEAR HARD DISK BIT LD (ARGSAV),A JP NZ,HBOOT ; ; FALL THROUGH TO JADE CONTRvNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNT JR NZ,ABORT ; ; TEST THE STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNN΁k9օsB߉{J獴Q Z(Ŗc2Ϛm< ٞwEᢱPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN CALL IIOPB ; LD A,(ARGSAV) ;SET DRIVE LD B,A AND A,1 ;SEPARATE DRIVE LD C,A LD A,B AND A,0FEH ;SEPARATE CONTRO$NNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNN(BIOSLN),A JR NZ,JADRDB ; ; EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ; ; ; ABORT RETURNS CONTROLːNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNND OK, COMPUTE CONTROLLER PORT ; JADE1: LD A,(IX + PBDRVO) ;PORT = DRIVE MOD 4 SRL A SRL A ADD A,40H CP A,44H ;IF CONT#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDRIVE PARAMETERS DW JTYPE4 ;RETURN DRIVE STATUS DW JTYPE4 ;SET EIA BAUD RATE DW JTYPE4 ;CLEAR NJCMDS EQU ($ - JADETBL)ysNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNX + PBST4O) ;FETCH COUNT LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; LD ANNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN; PUSH BC ;SAVE PORT # LD C,(IX + PBST4O) ;FETCH COUNT LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE-NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNDD HL,DE EX DE,HL ; PUSH IX ;SET IOPB ADDRESS POP HL ; PUSH BC ;SAVE PORT # LD BC,IOPBSZ LDIR POP BC ; ; ENNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNION IN CONTROLLER LD H,0 LD H,(HL) LD L,0 PUSH BC ;SAVE PORT # LD BC,DDCBO ADD HL,BC LD BC,IOPBSZ ;COUNT = REMAIN1NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!LLER SLA A OR A,C ;MERGE THE TWO LD (IOPB + PBDRVO),A ; ; LOG ON DRIVE ; LD BC,IOPB CALL JADEX CALL NZ,DBERR ^NNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNN TO THE MONITOR ROM ; ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++<@NNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNNROLLER > #4 THEN ERROR JR NC,DSKERR ; ; SAVE PORT # ; LD (FDCPRT),A LD C,A ; ; USE COMMAND TO INDEX INTO DRIVER T#@NNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNN / 2 ; ;---------------------------------------------------------------------------- ; ; TYPE 1 JADE COMMAND XFERS SECTOR -NNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT1 ; LDIR ;XFER DATA JT1: POP BC ; ; REMOVE JADE WINDOW ; XOR A,A $NNNNNNNNNNNNNNNNN D&NNNNNNNNNNNNNNNNNNNNNN THEN NO XFER JR NZ,JT2 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT2 ; LDIR ;XFER DATA JT2: POP BC ; ;~NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNXECUTE THE COMMAND ; LD A,DDEXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ; ; FALL INTO GET RESULTS FUNnNNNNNNNNNNNNNNNN,KNNNNNNNNNNNNNNNNNNNNNNDER LDIR POP BC ; ; RELEASE IOPB WINDOW ; XOR A,A OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PBSTATO) OR AgNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! JP NZ,DKRET ; ; READ 1ST BIOS SECTOR ; LD (IX + PBSECO),BIOSSEC LD (IX + PBCMDO),DDRDS LD BC,IOPB CALL JADEX CAL߿NNNNNNNNNNNNNNNN XNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- BC= IOPB ADDRESS ; DRIVE= {0..3}: PORT 406NNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNABLE ; LD A,(IX + PBCMDO) LD E,A LD D,0 LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,ANNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNN!DATA FROM CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE1: ; ; EXECUTE KNNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNN OUT (C),A RET ;---------------------------------------------------------------------------- ; ; TYPE 2 JADE COMMANDyNNNNNNNNNNNNNNNNN!wNNNNNNNNNNNNNNNNNNNNNN FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ?NNNNNNNNNNNNNNNNNN'ݱNNNNNNNNNNNNNNNNNNNNN!CTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULT?NNNNNNNNNNNNNNNNN-2zNNNNNNNNNNNNNNNNNNNNN!,A RET ;---------------------------------------------------------------------------- ; ; TYPE 3 JADE COMMAND XFERS FONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL NZ,DBERR JP NZ,DKRET ; ; FETCH PARAMETERS ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: LD BC,IOPB ; NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!H, {4..7}: PORT 41H ; EXIT - AF= 0: NO ERRORS ; IX= IOPB ADDRESS ; A,BC,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++FBNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN JP (HL) ; ; COMMAND TYPE TABLE ; JADETBL: DW JTYPE1 ;LOGON DISK DW JTYPE1 ;READ SECTOR DW JTYPE2 ;WRITE SECTORONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ; LD A,DDMB0 ;SOFTLY GRAB RESOURCES WIR NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN XFERS SECTOR DATA TO CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE2: ; NNNNNNNNNNNNNNNNNN""DNNNNNNNNNNNNNNNNNNNNNN; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- C= CONTROLLER PORT # {40..43H} ; IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS sNNNNNNNNNNNNNNNNN(͏NNNNNNNNNNNNNNNNNNNNNNS FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C= PORT ADDRESS OF BOARD {40..43H} ; (00[C])= HI BYTE BASE ADDRESS OF BOARD ; EXIT }NNNNNNNNNNNNNNNNNN.g)NNNNNNNNNNNNNNNNNNNNNNRMAT PGM TO CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE3: ; ; XFER FjNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNEXECUTE THE IOPB CALL JADEX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(IOPB + PBDMAO) ;BUMNNNNNNNNNNNNNNNNN :NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ JADEX: ; ; SAVE ARGUMENTS ; PUSH BC ;USE IX AS IOPB PTR POP IX ; ; SELECT(NNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN DW JTYPE3 ;FORMAT TRACK DW JTYPE1 ;READ ADDRESS DW JTYPE4 ;EIA OUTPUT DW JTYPE4 ;EIA STATUS DW JTYPE4 ;IDLE DWNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNTHOUT INTERRUPT OUT (C),A LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; LD E,(IX + PBDMAO) ;FETCH DESNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN; XFER DATA TO CONTROLLER ; LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; LD E,(IX + PBDMAO) ;FETCH NNNNNNNNNNNNNNNNN#uNNNNNNNNNNNNNNNNNNNNNN; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: LD A,DDMB0 ;OPEN WINDOWƳNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN- AF= 0: NO ERRORS ; DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: L]NNNNNNNNNNNNNNNNNN/TNNNNNNNNNNNNNNNNNNNNN!ORMAT PROGRAM TO CONTROLLER ; LD A,DDMB0 ;SELECT COMMAND BANK OUT (C),A ; LD L,(IX + PBDMAO) LD H,(IX + [PBDMAO + 1]);NNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNP LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF --COUNT != 0 THEN REPEAT DEC A LD 0NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN OPERATION ; LD A,(IX + PBCMDO) CP A,NJCMDS JP C,JADE1 ; ; ERROR ; DSKERR: LD A,-1 OR A,A RET ; ; ; COMMANENNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN JTYPE4 ;RETURN VERSION DW JTYPE4 ;SET DISK FLAGS DW JTYPE4 ;LOAD HEAD & IDLE DW JTYPE4 ;SEEK TRACK DW JTYPE4 ;SET .NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTINATION ADDRESS LD D,(IX + [PBDMAO + 1]) ; LD L,C ;FETCH FDC ADDRESS LD H,0 LD H,(HL) LD L,0 ; PUSH BC LD C,(I&NNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNDESTINATION ADDRESS LD D,(IX + [PBDMAO + 1]) ; LD L,C ;FETCH CONTROLLER ADDRESS LD H,0 LD H,(HL) LD L,0 EX DE,HL +NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN TO COMMAND BUFFER (BANK 0) OUT (C),A ; LD L,C ;COMPUTE CDB OFFSET ADDRESS LD H,0 LD H,(HL) LD L,0 LD DE,DDCBO ANNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNND A,DDMB0 ;RESELECT COMMAND BLOCK WINDOW OUT (C),A ; PUSH IX ;XFER IOPB RESULTS POP DE ; LD L,C ;COMPUTE IOPB LOCAT?SNNNNNNNNNNNNNNNNNN0GUNNNNNNNNNNNNNNNNNNNNNN LD E,C LD D,0 LD A,(DE) LD D,A LD E,0 ; PUSH BC LD C,(IX + PBST4O) LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6Ӆp?܉xG䍲O쑻X&Ėb0Κk:מuCࢯ}LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT3 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT3 ; LDIR ;XFER DNNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNISSUE CMD EX (SP),HL ;WASTE SOME TIME FOR DD TO CATCH UP EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,PNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!************************************************************** HBOOT: ; ; ISSUE CONTROLLER RESET & CONTINUE ; LD A,1 SHLANNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN USE PLATTER 1 OR C LD (IOPB + PBSECO),A EXX ; CLRWT: IN A,(HSTATUS) ;WAIT FOR CONTROLLER READY CP 0FFH ;IF NOT INSTAg{NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!T NZ ; ; LOAD THE CBIOS ; LD A,(DEFBFR + HDBIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY EXX ;ADD IN LOGICAL DRIVE OFFSE.NNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- BC= IOPB ADDRESS %NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!***************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;***************\NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNEC HL ;FETCH BIOS LOAD ADDRESS LD D,(HL) DEC HL LD E,(HL) ; IF DEBUG LD DE,(ARG2) ;DEBUG, LOAD IN AT ARG 2 ENDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNATA JT3: POP BC ; ; EXECUTE THE FORMAT DRIVER ; JP JEX ;-----------------------------------------------------------~gNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNHNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNN! HRESET OUT (HCMD),A XOR A OUT (HCMD),A ; ; INSURE FDC WINDOW REMOVED ; LD BC,0440H XOR A,A H1: OUT (C),A INC 8NNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN!LLED THEN QUIT JP Z,DKRET ; BIT HBUSYB,A ;ELSE WAIT JR NZ,CLRWT ; ; WAIT A WHILE IN CASE HOST ADAPTER FIDDLING WITH SINNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNT OR C EXX LD (IOPB + PBSECO),A ; LD BC,IOPB CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS RkINNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNN; EXIT - AF= 0: NO ERRORS ; IX= IOPB ADDRESS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++e NNNNNNNNNNNNNNNNNN&ٰNNNNNNNNNNNNNNNNNNNNNN************************************************************* HWBUSY: IN A,(HSTATUS) ;WAIT FOR DONE BIT HBUSYB,A JR NZ,HWBUNNNNNNNNNNNNNNNNN,6{NNNNNNNNNNNNNNNNNNNNNNIF LD (BIOSNT),DE ;SAVE START ADDRESS ; DEC HL ;FETCH BIOS LENGTH LD B,(HL) DEC HL LD C,(HL) LD (BIOSLN),BC ;SAVE mSNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN----------------- ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ;------------------------------------------NNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNN ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DDSHLT JR NZ,JW.|NNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNC DJNZ H1 ; ; SET UP IOPB IN RAM ; CALL IIOPB ; ; SAVE LOGIN DRIVE FOR BIOS ; LD A,(ARGSAV) ;COMPUTE & SET DRIVE.NNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNNTATUS PORT ; LD HL,0 HB1: DEC HL LD A,H OR L JR NZ,HB1 ; ; AND CHECK AGAIN ; IN A,(HSTATUS) BIT HBUSYB,A JRNNNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNET NZ ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: LD BC,IOPB CALL ISHAX CALL DQERR RET NZ ; 6INNNNNNNNNNNNNNNNN!@'NNNNNNNNNNNNNNNNNNNNN! ISHAX: PUSH BC POP IX ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (HDATA),A LD A,HIOPBL OUT (HCM~NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN!SY RET ;**************************************************************************** ; ; COMMON SETUP IOPB FOR BIOS REAANNNNNNNNNNNNNNNNN-JNNNNNNNNNNNNNNNNNNNNNNIT ; LD HL,DEFBFR ;MOVE THIS SECTOR TO PROPER PLACE LD BC,SECSIZ LDIR ; LD (IOPB + PBDMAO),DE ;SET UP NEW DMA ADDRESS 1wNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN---------------------------------- JTYPE4: EQU JEX ;**********************************************************************KdNNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNNAIT1 ; RET ;RETURN ZF IF $ >= 0FC00H CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL pQNNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNN! LD (LOGINBY),A ;STORE DRIVE IN CP/M LOGIN BYTE FOR CBIOS ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_[9NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; CHECK SELF TEST STATUS ; LD IX,IOPB CALL DQERR ; ; FORCE HOST ADNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN INC (IX + PBSECO) ;NEXT SECTOR (IX SET TO IOPB BY ISHAX) ; LD HL,(IOPB + PBDMAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,`NNNNNNNNNNNNNNNNNN"tNNNNNNNNNNNNNNNNNNNNN!D),A CALL HWBUSY ; LD A,B OUT (HDATA),A LD A,HIOPBH OUT (HCMD),A CALL HWBUSY ; XOR A,A OUT (HDATA),A LD A,HIúmNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!D SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; EXIT - CF= ERROR ; IX= IOPB ADDRESS ; A,HL,DE,BC= ? ; ;*********************NNNNNNNNNNNNNNNNNN.PNNNNNNNNNNNNNNNNNNNNNN ; LD IX,IOPB ;POINT TO IOPB INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SƐNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!****** ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C= PORT OF CONTROLLER ; EXIT - AF= 0: OK,NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!HARD DISK BOOT ;**************************************************************************** ; ; Hard disk boot function. ; QNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNDRIVE / 2 LD (IOPB + PBDRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,8/~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAPTER LOG-ON ; LD BC,IOPB CALL ISHAX ;LOGON DRIVE CALL DQERR RET NZ ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) NNNNNNNNNNNNNNNNN#&ENNNNNNNNNNNNNNNNNNNNN!OPBX OUT (HCMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,HEXEC OUT (HCMD),A CALL HWBUSY ; ; R^NNNNNNNNNNNNNNNNN)ɎNNNNNNNNNNNNNNNNNNNNNN******************************************************* STUPBIOS: LD A,(DEFBFR + 1) ;FETCH BIOS LOAD PARAMETERS CP A,SECSIZNNNNNNNNNNNNNNNNNN/c(NNNNNNNNNNNNNNNNNNNNN!ECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H ENNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN /0: ERROR ; DE,HL= ? ; ;**************************************************************************** JWAIT: OUT (C),A ;b_NNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNThis module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;**************\NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD C,A ; EVEN= 0, ODD= 80H (128) ; LD A,(IOPB + PBSECO) ;IF ODD, THEN}eNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN+ PBCMDO),DDRDS LD (IX + PBSECO),HDIRSEC LD BC,IOPB CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR RENNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNN!;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF @NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNETURN THE ERROR STATUS ; LD A,(IX + PBSTATO) OR A,A RET ;***********************************************************NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ;CHECK LIMITS OF OFFSET CCF RET C ; LD HL,DEFBFR ;COMPUTE OFFSET TO CBIOS VECTORS LD E,A LD D,0 ADD HL,DE ; D'NNNNNNNNNNNNNNNNNN0peNNNNNNNNNNNNNNNNNNNNNN RL H LD A,H DEC A ;ALREADY HAVE 1ST SECTOR LD (BIOSLN),A ;PUT INTO VAR ; ; RETURN NO ERROR ; OR A,A RET ;**)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁k9ԅq@݉yG卲O푼Y'Ɩc1Κk; מuCࢯ}KNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN************************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; EXIT - NNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNNAF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE &mNNNNNNNNNNNNNNNNN eNNNNNNNNNNNNNNNNNNNNNN************************************** DQERR: LD A,(IX + PBSTATO) ;CHECK FOR ERROR OR A,A RET Z ; DBERR: PUSH BC ;SAVE P (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END NNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNS DW 0,0 ;SPARE (BLT) DW 0,0 ;SPARE (DCM) DW 4,23 ;BIOS DIRSIZ EQU $ - F8DIR ; ; FORMAT TABLE DEFINES WHERE DATA GNNNNNNNNNNNNNNNNN#@XNNNNNNNNNNNNNNNNNNNNNN****************** ; ; This Monitor program resides at the top of memory & ; allows memory modification & testing, program br$NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!romised. 'S'ubstitute will still ; allow monitor area to be modified if needed. Old version assumed ; monitor was in rom and nxNNNNNNNNNNNNNNNNNNNN/5NNNNNNNNNNNNNNNNNNNNNNtime clock & cassette ; 'L'oad / 'U'nload commands. ; ; 1.3 - 8 OCT 85 GRH ; Add disk read, write & boot commands. ; Add NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH ONNNNNNNNNNNNNNNNNN VNNNNNNNNNNNNNNNNNNNNNNISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;**************************************7NNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN******************************************* CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;*********************************= (ROM - 128) CONMSG **** Variables run into disk buffer **** ENDIF DS ROM - 128 DBUFF DS 128 ;DISK I/O DATA BUFFe$NNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN POP HL LD SP,(ISPSAV) ENDM SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETSW NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;RETURN LINE PRINTER STATUS IN A FUNCTION JP SETBACK ;SET & RETURN BACKGROUND VECTORHNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNOR LATER LD B,SPSV - MONVARS LD HL,MONVARS VINITL: LD (HL),0 INC HL DJNZ VINITL LD A,4 ;INIT TICK COUNT LD (TIBNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN============== ; ; COMPILE TIME VARS ; ;============================ ROM EQU 0F800H ;ROM START ADDR NBKPTS EQU 2 ;MAX NU'NNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNN!====================== WSVEC EQU 0000H ;VECTOR NUMBER FOR WARM RESTART ;============================ ; ; CONSTANTS ; 4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;FLAGS ALOC DS 1 ;A SLOC DS 2 ;SP ; ; BREAKPOINTS ; TLOC: REPT NBKPTS DS 2 ;BREAKPE9rNNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNN, 1: ENABLED ; RAMSTAT EQU 3 ;RAM ENABLED BIT INTSTAT EQU 7 ;INTERRUPTS ENABLED BIT ; TEMP DS 2 ;TEMPORARY STORAGE TIC-NNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNER SUBTTL MACROS ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; SAVE REGISTERS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SAVE MACRO PUSH HLZHNNNNNNNNNNNNNNNNN ";NNNNNNNNNNNNNNNNNNNNNN FOR BASIC I/O ; ;-------------------------------------- CBOOT JP CINIT - ROM ;COLD START CONIN JP CI ;RETURN CHAR FROM CONGNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN FUNCTION JP GETTICK ;RETURN TICK COUNT IN HL FUNCTION JP GETCLKP ;RETURN CLOCK ARRAY PTR IN HL FUNCTION ;----------- 2NNNNNNNNNNNNNNNNN,gVNNNNNNNNNNNNNNNNNNNNNNKCNT),A LD HL,0 ;INIT GOTO JUMP & HL REG IMAGE LD (LLOC),HL LD (PLOC),HL LD HL,USRSTK ;INIT SP REG LD (SLOC),HL TNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNNMBER OF BREAKPOINTS ALLOWED OVLSIZ EQU 512 ;MAX SIZE OF OVERLAYS ;============================ ; ; I/O ROM ENTRY VECTORS NNNNNNNNNNNNNNNN ENNNNNNNNNNNNNNNNNNNNNN;============================ BELL EQU 7 LF EQU 0AH CR EQU 0DH CTRLS EQU 13H ;ASCII DC3 ;============================ dNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNOINT ADDRESS DS 1 ;BREAKPOINT DATA (INSTRUCTION REPLACED BY RST8) ENDM ; ; ALL THE FOLLOWING IS NOT INITIALIZED TO 0 ;dNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNKS DS 2 ;CLOCK TICKS ACCUMULATED TIKCNT DS 1 ;CLOCK SECONDS COUNT TOD DS 7 ;CLOCK ARRAY BYTC DS 2 ;CASSETTE BYTE COUNT B{NNNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN PUSH DE PUSH BC ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; RESTORE REGISTERS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ RESTORT NNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNNSOLE IN A FUNCTION JP SUDI ;SUDING FORMAT CASSETTE INPUT FUNCTION CONOUT JP CO ;OUTPUT CHAR IN C TO CONSOLE FUNCTION JP SMINNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN--------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: DI LD A,DYVNNNNNNNNNNNNNNNNN-TgNNNNNNNNNNNNNNNNNNNNNN ;-------------------------------------- ; ; INSERT I/O INIT CODE HERE ; ;-------------------------------------- LD HL,IOiNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ; ;============================ ORG IOROM VIDINIT DS 3 ;VIDEO OUTPUT INITIALIZATION VIDOUT DS 3 ;OUTPUT CHAR IN C FUNCTION֫mNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; ; VARIABLE AREA ; ;============================ ORG ROM - 256 USRSTK EQU $ ;START OF USER STACK UPON GOTO MONVARS EQUёmNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN SPSV DS 2 ;STACK PTR SAVE LOCATION ; ; INTERRUPT STACK ; DS 24 ISTACK EQU $ ISPSAV DS 2 ; ; I/O LOCAL STACK ; IOSTA,dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!YTSR DS 2 ;CASSETTE BYTES READ ; ; DISK IOPB ; IOPB: PBCMD DS 1 ;COMMAND BYTE PBDRV DS 1 ;DRIVE NUMBER BYTE PBTRK DS 2MNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNE MACRO POP BC ;RESTORE USER ENVIRONMENT POP DE POP HL ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INTERRUPT SAVE ; ;SNNNNNNNNNNNNNNNNN"DYNNNNNNNNNNNNNNNNNNNNNNUDO ;SUDING FORMAT CASSETTE OUTPUT FUNCTION LIST JP LO ;OUTPUT CHAR IN C TO LIST DEVICE FUNCTION CONST JP CSTS ;RETURN CONS'NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNSTAT + ON ;DISABLE ROMS, ENABLE RAM OUT (PORT0),A LD (MONSTAT),A ;INTERRUPTS = FALSE TOO LD SP,3FH ;USE STACK TO INIT RcNNNNNNNNNNNNNNNNNN.4NNNNNNNNNNNNNNNNNNNNNNTABL ;INIT PROGRAMMABLE DEVICES INIT3 LD B,(HL) ;FETCH BYTE COUNT INC HL LD C,(HL) ;FETCH PORT # INC HL OTIR BIT 7,&NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN! KBINIT DS 3 ;KEYBOARD INIT FUNCTION, LOW INTVEC IN C KBDIN DS 3 ;RETURN NEXT KEYBOARD CHAR IN A FUNCTION KBDST DS 3 ;RETURN TiNNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNN $ ;START OF MONITOR VARIABLE AREA STKTRAP DS 2 ;LOCATION FOR RS9 VECTOR UPON GOTO MONSTK EQU $ ;MONITOR STACK START ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCK EQU AUXMEM + 2048 ;PUT STACK IN AUX RAM SINCE AVAILABLE IOSPSAV DS 2 ;PUT STACK PTR HERE SO ACCESSIBLE FOR RETURN ; V BNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN ;TRACK WORD PBSEC DS 2 ;SECTOR WORD PBFLG DS 1 ;FLAG BYTE PBDMA DS 2 ;XFER ADDRESS START WORD PBDMAX DS 1 ;XFER ADDRESS EXT^INNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@ ISAVE MACRO LD (ISPSAV),SP LD SP,ISTACK PUSH HL PUSH DE PUSH BC PUSH AF ENDM ;@@@%NNNNNNNNNNNNNNNNNN#whNNNNNNNNNNNNNNNNNNNNNNOLE STATUS IN A FUNCTION JP SELRAM ;SELECT RAM FUNCTION JP CHKINT ;SET INTERRUPTS TO FLAG FUNCTION JP MEMCK ;RETURN MEMNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 LD SP,MONSTK ;SET UP STACK 8'NNNNNNNNNNNNNNNNNNN/2NNNNNNNNNNNNNNNNNNNNN!(HL) ;IF COUNT > 127 THEN DONE JR Z,INIT3 LD C,CTCAV ;ENABLE KEYBOARD LD HL,KBINIT CALL CALLROM LD A,HIGH INTTBLtNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNN0: NOT READY, FFH: CHAR WAITING IN A KBDINT DS 3 ;KEYBOARD INTERRUPT ROUTINE ; DKBOOTV DS 3 ;DISK BOOT XCUTE DS 3 ;EXECUTE IcsrNNNNNNNNNNNNNNNNNN aNNNNNNNNNNNNNNNNNNNNNN; REGISTER IMAGES ; RLOC DS 1 ;REFRESH ILOC DS 1 ;INTERRUPT YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOC DS 1 ;FLAGS' APLOC DS 1 ;A',gNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNALUE STORAGE AS WELL. ; ; MONITOR STATUS BITS ; MONSTAT DS 1 ; 7 0 ; |IES| 0 | 0 | 0 |RAS| 0 | 0 | 0 | ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENDED (NOT USED) PBSTAT DS 1 ;STATUS RETURNED (0: NO ERRORS) DS PBCMD + IOPBSZ - $ ;SPARES TO FILL 16 BYTES OF IOPB IF NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INTERRUPT RESTORE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IRESTORE MACRO POP AF POP BC POP DE|NNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNORY LIMIT FUNCTION JP CALLROM ;CALL ROM VECTOR IN HL FUNCTION JP DISPATCH ;CALL INTERRUPT ROM VECTOR IN HL FUNCTION JP RE{NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! LD HL,USRMSG ;OUTPUT 'MEMORY= ' CALL PRTWD ; ; CONTINUATION OF THE SCS MONITOR ; LD (SPSV),SP ;SAVE STACK F NNNNNNNNNNNNNNNNNNN0!HNNNNNNNNNNNNNNNNNNNNNN ;INIT INTERRUPTS LD I,A LD (ILOC),A ;DEFAULT I REGISTER IM 2 LD HL,MONSTAT ;INTERRUPTS ON SET INTSTAT,(HL) EI LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNN΁l: ؅vE≰~MꍷT#]+ʖi7Ԛq@ݞzI梵R!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNVhNNNNNNNNNNNNNNNNNNNNNND HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ;---------------------------- ; ; THE WARM START CODE ; ;---------------------(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ADD A,A ;COMPUTE OVERLAY ADDRESS LD E,A LD HL,0800H ;2ND HALF OF 4K EPROM ADD HL,DE PUSH BC DI ;NO INTERRUPTS WNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ MEMCK: LD A,LOW (MONVARS - 60) LD B,HIGH (MONVARS - 60) RET ;++++++++++++++++JNNNNNNNNNNNNNNNNNN3yNNNNNNNNNNNNNNNNNNNNNNNTRY SEQUENCE & ; CAUSE A WARM BOOT OF THE MONITOR. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;+++++LSNNNNNNNNNNNNNNNNNNܲNNNNNNNNNNNNNNNNNNNNNN******** ; ; OUTPUT QUERY MESSAGE ; ;**************************** QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE JP PRTWD SUBT[ NNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN+ DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CYNNNNNNNNNNNNNNNNN%JNNNNNNNNNNNNNNNNNNNNNN: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H >INNNNNNNNNNNNNNNNNN+ENNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++ ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUXNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;PUT RETURN ADDRESS ON STACK PUSH HL LD (WSVEC + 1)HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHILE ACCESSING ROM XOR A,A ;ENABLE ROM OUT (PORT0),A LD A,(HL) ;FETCH PTR TO OVERLAY INC HL LD H,(HL) LD L,A }'NNNNNNNNNNNNNNNNNNFVNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++ ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;++++++TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS T!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!TL GENERAL PURPOSE SUBROUTINES ;*************************************************************** ; ; CONV ROUTINE CONVERTS THEV#BNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD DE,OVERLAY ;DEST = OVERLAY AREA LD BC,OVLSIZ LDIR ;MOVE OVERLAY TO BUFFER POP BC LD A,DYSTAT + ON ;TURN OFF ROM 7NNNNNNNNNNNNNNNNNNugNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++ EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;+++++++++++++++++++^`INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBL[NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; EXIT - C= 'N' ; ;****************************************GNNNNNNNNNNNNNNNNN!PNNNNNNNNNNNNNNNNNNNNNNERS, THEN DOES A CR-LF ; EXIT - DE= P1 ; BC= P2 ; HL= P3 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++MNNNNNNNNNNNNNNNNNN'(NNNNNNNNNNNNNNNNNNNNN! ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;*******************NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++ NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9W;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 'A' -> 'F' THEN ERR JP C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD E,A ;SET UP NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN OUT (PORT0),A EI LD A,(OVERLAY) ;IF OVERLAY CORRECT THEN EXECUTE IT CP C JP Z,OVERLAY + 1 LD HL,OVLERRM ;ELSE ERNNNNNNNNNNNNNNNNNNf*NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 ; BIT HEX ^NNNNNNNNNNNNNNNNNŇNNNNNNNNNNNNNNNNNNNNNNE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NENNNNNNNNNNNNNNNNNN#GNNNNNNNNNNNNNNNNNNNNNN*********************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DSNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN++ EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;+++++++++++++++++++++++++++++++++jGNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN*************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC INNNNNNNNNNNNNNNNNN.@NNNNNNNNNNNNNNNNNNNNNN' - 1 CP 10 RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PCHK ROUTINE READS A CHARACTER F} NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFOR TABLE LOOKUP LD D,0 LD HL,TBL ;OVERLAY_# = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC A ;IF -1 THEN UNSUPPORTED NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ROR JP PRTWA ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMCHK FUNCTION RETURNS THE TOP OF AVAILABnNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNVALUE FOR EACH ONE. ; A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. ; A BLANK OR COMMA WILL END THE CURRENT PARAMETER ENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DENNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNNAA LD C,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ECHO ROUTINE READS A BYTE FROM CONfNNNNNNNNNNNNNNNNNN#6NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& ; DISALLOWS) A WRAP-AROUND SITUATION. P!NNNNNNNNNNNNNNNN)'NNNNNNNNNNNNNNNNNNNNNN HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI NNNNNNNNNNNNNNNNNNN/sNNNNNNNNNNNNNNNNNNNNN!ROM THE CONSOLE, THEN ; CHECKS IT FOR A DELIMITER. IF IT IS NOT A DELIMITER, A NON- ; ZERO CONDITION IS RETURNED. IF IT IS Am{'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!COMMAND JR Z,QPRT DEC A LD C,A LD HL,OVERLAY ;IF OVERLAY ALREADY INSTALLED THEN EXIT CP (HL) JP Z,OVERLAY + 1 rNNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNN!LE ; MEMORY (LESS 60 BYTES FOR THE MONITOR STACK) ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;++++++++++++++++++&NNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN!NTRY. ; EACH PARAMETER ONLY TAKES THE LAST 4 DIGITS TYPED IN, ANY EXCESS IS ; DISCARDED. A NON-HEX DIGIT WILL TERMINATE THE E@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;********************rNNNNNNNNNNNNNNNNNE%NNNNNNNNNNNNNNNNNNNNNNSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++A$NNNNNNNNNNNNNNNNNN${NNNNNNNNNNNNNNNNNNNNNN; EXIT - CF= HL + 1 == 0 (WRAP AROUND) ; F= HL - DE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILOOnNNNNNNNNNNNNNNNNNN*tNNNNNNNNNNNNNNNNNNNNN!;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;+++++++++++++++++++++++++++++ ۞xG㢲ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNaXNNNNNNNNNNNNNNNNNNNNNNESETS THE CARRY ; FLAG. ; EXIT - Z CF ; 1 0 : DELIMITER ; 1 1 : CR ; 0 0 : CHARACTER ; 0 1 : NEVER RETURNED NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*********** REST: DI ;INSERT INTERRUPT DISABLE HERE PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF LD DE,SLOC + 2 MNNNNNNNNNNNNNNNNN $5NNNNNNNNNNNNNNNNNNNNNN;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ; INNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNHL ;DO NEXT BP DJNZ RS7 ; ; BREAKPOINTS REMOVED, SAVE REMAINING REGS ; LD SP,HPLOC + 1 EX AF,AF' ;NOW SAVE THE Z80 UuVNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOP BC POP AF POP HL LD SP,HL LLOC EQU $ + 1 HLOC EQU $ + 2 LD HL,0 GIE EI ;ENABLE INTERRUPTS ON EXECUTION HERE PLONNNNNNNNNNNNNNNNNNA$NNNNNNNNNNNNNNNNNNNNNNBLE POINTER LD E,(HL) INC HL LD A,(HL) ;GET OFFSET & ATTRIBUTES FROM HIGH BYTE OR HIGH (ROM AND 0F000H) LD D,A NNNNNNNNNNNNNNNNN%zNNNNNNNNNNNNNNNNNNNNNNORS ARE DETECTED: A RESTART ERROR; ; & CERTAIN PROGRAM ERRORS (DETERMINED BY ; PARTICULAR ROUTINE WHERE THE ERROR CONDITIONNNNNNNNNNNNNNNNNNN+uNNNNNNNNNNNNNNNNNNNNN! ; ;******************************************************************** CONI: CALL CI AND 7FH RTS: RET ;***********XNNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNN ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURNk3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;SET UP PTR TO REGISTER IMAGES LD HL,10 ;GO UP 10 BYTES IN STACK TO RETURN ADDRESS ADD HL,SP ;COMPUTE SP AT TIME OF BREAKPbNNNNNNNNNNNNNNNNNNqfNNNNNNNNNNNNNNNNNNNNNN; UNSET BREAKPOINT ENCOUNTERED ; INC BC ;NONE FOUND ; ; BREAKPOINT FOUND IN TABLE ; RS5: PUSH BC ;BREAK ADDR LDsHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC LD A,VNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNC EQU $ + 1 JP 0 ;************************************** ; ; NO ARGS, DISPLAY ALL REGS SUBR ; ENTRY- HL= REGISTER TAB@HNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNNLD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PA NNNNNNNNNNNNNNNNNN&)NNNNNNNNNNNNNNNNNNNNNN WAS ENCOUNTERED) ; EACH CAUSES A UNIQUE MESSAGE TO BE PRINTED, THEN DOES A WARM ; INIT OF THE MONITOR. ; ;--------------bdNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!**************************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRINNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RE7=NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOINT LD B,4 ;DO SP..DE EX DE,HL ;BPSP -> DE, .SP_REG -> HL RS1: DEC HL LD (HL),D ;SAVE REGS IN WORK AREA [SP,AF,BC,DH9NNNNNNNNNNNNNNNNNNBWNNNNNNNNNNNNNNNNNNNNNN C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP HL ;BP LOCATION LD A,HIGH RS9 ;IF A RETURN BREAK THEN SKIP OUTPUT CP rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHIGH INTTBL ;RESTORE INTERRUPT VECTORS LD I,A IM 2 EI LD HL,ACTBL ;DISPLAY REGS CALL XG JP WINIT ;RETURN TO MONITNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLE PTR ; ;************************************** XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z NNNNNNNNNNNNNNNNN!gNNNNNNNNNNNNNNNNNNNNNNIR INC DE ;DO HIGH BYTE 1ST RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 ; ; INDIRECT, GET VALUE OF PTR TO VALUE ; PUSH TNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------- ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROʈNNNNNNNNNNNNNNNNN-"NNNNNNNNNNNNNNNNNNNNNNG MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR ; OF THE STRING. THE STRING WILL START A NEW LNE (PRTWD) OR ; CONTINUE ONRnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTURN NC RET ;*************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTERNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!E] DEC HL LD (HL),E POP DE ;NEXT REG DJNZ RS1 ;FALLS OUT WITH HL REG VALUE IN DE LD (LLOC),DE ;SAVE HL VALUE Pf:NNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN H JR Z,RS6 LD (PLOC),HL ;SAVE FOR GOTO CALL LADR ;OUTPUT BP ADDRESS ; ; REMOVE BREAKPOINTS ; RS6: LD HL,TLOC LDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOR ; ; IF GOTO EXECUTION ADDRESS IS A SUBROUTINE THEN EXECUTION MAY ; RETURN HERE ; RS9: PUSH HL RST 8 ;FORCE BP ;NNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNCALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ;*****NNNNNNNNNNNNNNNNNN"2NNNNNNNNNNNNNNNNNNNNNNHL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWo NNNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNNR HANDLER ; ;------------------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COONNNNNNNNNNNNNNNNNN.wNNNNNNNNNNNNNNNNNNNNNN THE SAME LINE (PRTWA). ; ;*************************************************************** PRTWD: CALL CRLF PRTWA: PUSH BCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CONTENTS ; WHENEVER A RESTART 1 INSTRUCTION IS EXECUTED. THE TRAPPED ; CONTENTS ARE STORED IN THE SYSTEM STACK AREA FOR LATYNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!OP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,MONSTK ;SET THE MONITOR STACK ; ; CHEBNNNNNNNNNNNNNNNNNNb+NNNNNNNNNNNNNNNNNNNNNN BC,NBKPTS * 256 RS7: LD E,(HL) ;FETCH BP ADDR IN DE LD (HL),C ;NULL BP ADDRESS INC HL LD D,(HL) LD (HL),C INC HLtrNNNNNNNNNNNNNNNNNNȍNNNNNNNNNNNNNNNNNNNNNN ; THE GOTO ROUTINE USES THE EXIT ROUTINE TO SET CPU REGISTERS TO THE ; REGISTER VALUES & EXECUTES THE GOTO ADDRESS ; EXIT:0NNNNNNNNNNNNNNNNN'FNNNNNNNNNNNNNNNNNNNNNN******************************************* ; ; PRINT REGISTER VALUE SUBR ; ENTRY- HL= TABLE PTR TO CHAR ; EXIT - DE= PTR TOxNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 INC DE ;REPOIN=NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!MMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;*******rNNNNNNNNNNNNNNNNNN/DNNNNNNNNNNNNNNNNNNNNN! PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTA PRTB+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNER ACCESS ; AND USE BY THE GOTO & THE EXAMINE REGISTERS COMMANDS. ; ; ;****************************************************yyNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCK FOR BREAKPOINTS ; LD D,NBKPTS LD HL,TLOC RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B "!NNNNNNNNNNNNNNNN7xNNNNNNNNNNNNNNNNNNNNNN LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC NNNNNNNNNNNNNNNNNNسNNNNNNNNNNNNNNNNNNNNNN POP BC LD A,C LD R,A LD A,B LD I,A POP IY POP IX POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE PyNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN REG VALUE LOW BYTE ; HL= PTR TO ATTRIB. BYTE ; ;************************************************ PRTVAL: INC HL ;FETCH TAn NNNNNNNNNNNNNNNNNN$KNNNNNNNNNNNNNNNNNNNNN!T TO LOW BYTE OF REGISTER VALUE RET ;--------------------------------------------------------------- ; ; 2 TYPES OF ERRNNNNNNNNNNNNNNNNNN*DNNNNNNNNNNNNNNNNNNNNNN************************************************************* ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ANNNNNNNNNNNNNNNNNN0WNNNNNNNNNNNNNNNNNNNNNN: POP BC RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTSlNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁k9օtCቯ~MꍷT#^,˖h7Ԛq@ݞzH墴S!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNʹNNNNNNNNNNNNNNNNNNNNNN THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXLF: NNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JP CO ;********(NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ILE SWAPPING STACKS ; DI ; ; SAVE THIS STACK ; LD (IOSPSAV),SP ;SAVE THIS STACK ; ; SELECT ROM ; LD A,(MONSTAT)7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWAPPING ENVIRONMENT ; ; RESTORE CALLER'S STACK ; LD SP,(IOSPSAV) ; ; FALL THROUGH TO SELECTING RAM ; ;*********NNNNNNNNNNNNNNNNNGnNNNNNNNNNNNNNNNNNNNNNNABLED THEN LD A,(IOSPSAV) ; RESTORE RETURN VALUE RET Z ; RETURN ; EI ;ELSE ENABLE INTERRUPTS RET ;*********qNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN SETBACK: LD A,00000001B ;DISABLE INTERRUPT WHILE CHANGING VECTOR OUT (CTCB2),A PUSH DE LD DE,(MSVEC) LD (MSVEC),HL 6NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN! ; CLOCK 250MS INTERRUPT HANDLER ; ;************************************** TIMER: ISAVE PUSH HL ;HL TOO LD HL,(TICKS)NNNNNNNNNNNNNNNNNN+$NNNNNNNNNNNNNNNNNNNNNN LD (DE),A ;STORE NEW VALUE RET C ;IF NO ROLLOVER THEN RETURN INC HL ;ELSE NEXT ARRAY INC DE DJNZ CLOCK2 ;IF NOT DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCALL EXPR POP DE POP HL ;*************************************************************** ; ; CRLF ROUTINE OUTPUTS A CI#NNNNNNNNNNNNNNNNNNw,NNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;*****************|LNNNNNNNNNNNNNNNNNN݊NNNNNNNNNNNNNNNNNNNNNN ;TELL INTERRUPT ROUTINES WE'RE IN ROM RES RAMSTAT,A LD (MONSTAT),A ; XOR A,A ;DISABLE RAM, ENABLE ROMS & STACK OUT (PNNNNNNNNNNNNNNNNN12NNNNNNNNNNNNNNNNNNNNNN******************* ; ; SELECT RAM SUBROUTINE ; (NEEDED FOR BOOTED ROUTINE) ; ;**************************** SELRAM: ; !NNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN********************************** ; ; DISPATCH TO ROM INTERRUPT VECTOR SUBR ; ENTRY- HL= VECTOR ; ;*********************wNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNN! INC HL ;IF VECTOR != -1 THEN LD A,L OR H JR Z,SETBAK1 LD A,10000001B ; ENABLE INTERRUPT OUT (CTCB2),A SETBAK1NNNNNNNNNNNNNNNNNN&RNNNNNNNNNNNNNNNNNNNNN! ;BUMP FREE RUNNING CLOCK TICK COUNT INC HL LD (TICKS),HL LD HL,TIKCNT ;IF --TICK_CNT == 0 THEN DEC (HL) JR NZ,TIMERG NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNONE THEN REPEAT RET ;ELSE RETURN TODTAB: DB 60H ;SECONDS PER MINUTE DB 60H ;MINUTES PER HOUR DB 24H ;HOURS PER DAY krNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: H%BNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNN***************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JP CO ;******************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNORT0),A ; ; SET UP NEW STACK ; LD SP,IOSTACK ; ; NOW ABLE TO INTERRUPT AGAIN ; CALL CHKINT ; ; SAVE ENVIRONMENdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; SAVE POSSIBLE RETURN VALUE ; LD (IOSPSAV),A ;SAVE RETURN VALUE ; ; SELECT RAM ; LD A,(MONSTAT) ;DO INTERRUPT ROUTIV NNNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNN********************** DISPATCH: ISAVE XOR A,A ;SELECT ROM OUT (PORT0),A PUSH HL ;SAVE VECTOR LD HL,DISPATR ;PUT STACK ; ; EXECUTE ROM VECTOR ; LD HL,ROMRET ;PUT RET ADDRESS ON STACK & FENNNNNNNNNNNNNNNNNNWPNNNNNNNNNNNNNNNNNNNNNNNE 1ST SET RAMSTAT,A LD (MONSTAT),A LD A,DYSTAT + ON OUT (PORT0),A ;******************************************* ; VNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRETURN ADDRESS ON STACK EX (SP),HL JP (HL) ;EXECUTE VECTOR DISPATR: LD A,(MONSTAT) ;IF ROM INTERRUPTED THEN SKIP RAM SEL$!NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNORDS ; ;************************************** MSVEC DW -1 ;INITIAL VECTOR = NONE MILISEC: PUSH HL PUSH AF LD HL,(M~NNNNNNNNNNNNNNNNN(qNNNNNNNNNNNNNNNNNNNNNNE EI RETI ;**************************** ; ; CLOCK TIME KEEPER ; ;**************************** CLOCK: LD DE,TOD NNNNNNNNNNNNNNNNNN.lNNNNNNNNNNNNNNNNNNNNNNICK COUNT ; ;++++++++++++++++++++++++++++++++++++++ GETTICK: LD HL,(TICKS) RET ;++++++++++++++++++++++++++++++++++++S\!NNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNN ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; BNNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN************************************* ; ; ROM CALLER ; ROM CODE MUST HANDLE INTERRUPT ENABLES ; ENTRY- HL= ROM VECTOR ADDR?INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTCH VECTOR EX (SP),HL JP (HL) ;EXECUTE ROM CODE ; ; ROM RETURNS HERE ; ROMRET: ; ; RESTORE CALLER'S ENVIRONMENT &NNNNNNNNNNNNNNNNNNdaNNNNNNNNNNNNNNNNNNNNN! ; SELECTIVELY ENABLE INTERRUPTS FUNCTION ; EXIT - ZF= INTERRUPTS DISABLED ; NZ= INTERRUPTS ENABLED ; A= (IOSPSAV) ; ;*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNECT OUT (PORT0),A IRESTORE RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++ ; ; SET BACKGROUND NNNNNNNNNNNNNNNNNN#0NNNNNNNNNNNNNNNNNNNNNNSVEC) ;IF VECTOR == -1 THEN INC HL LD A,L OR H DEC HL JR NZ,DOMSVEC POP AF ; IGNORE INTERRUPT POP HL JR MSR$NNNNNNNNNNNNNNNNN)BNNNNNNNNNNNNNNNNNNNNNN;POINT TO TIME OF DAY ARRAY LD HL,TODTAB ;MAX COUNT TABLE LD B,4 ;ELEMENT COUNT CLOCK2: LD A,(DE) ;INCREMENT TIME WITH ADayNNNNNNNNNNNNNNNNNN/]NNNNNNNNNNNNNNNNNNNNNN++ ; ; RETURN CLOCK ARRAY PTR FUNCTION ; EXIT - HL= ARRAY PTR ; ;++++++++++++++++++++++++++++++++++++++ GETCLKP: LD HLNNNNNNNNNNNNNNNNNT#NNNNNNNNNNNNNNNNNNNNNN CURSOR LOCATION (LADR). ; ;*************************************************************** LADRA: CALL CRLF LADR: LD A,H NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ESS ; EXIT - AF, HL= RETURN VALUES (?) ; ;******************************************* CALLROM: ; ; DISABLE INTERRUPTS WH3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!; POP BC ;RESTORE ENVIRONMENT POP DE ; ; NO INTERRUPTS WHILE SWAPPING STACKS ; DI ;DISABLE INTERRUPTS WHILE S̋NNNNNNNNNNNNNNNNNNt_NNNNNNNNNNNNNNNNNNNNNN****************************************** CHKINT: DI ;ASSUME DISABLED LD A,(MONSTAT) BIT INTSTAT,A ;IF INTERRUPTS NOT ENBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN TASK VECTOR FUNCTION ; ENTRY- HL= VECTOR (-1= NONE) ; EXIT - HL= VECTOR ON ENTRY ; ;++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNNNET DOMSVEC: POP AF CALL DISPATCH ;EXECUTE VECTOR POP HL MSRET: EI RETI ;************************************** ;NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!D INSTRUCTION ADD A,1 DAA ;CONVERT TO BCD CP (HL) ;IF ROLLOVER THEN JR C,CLOCK3 XOR A ;THIS ARRAY = 0 CLOCK3:BNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!,TOD RET SUBTTL MESSAGES LOGMSG: DB 'DGMON V ',HIGH VERSN,'.',LOW VERSN CRMSG: DM CR,LF USRMSG: DB 'MEMORY = ' DB (MONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNˁh6Ӆq@݉zI捴Q Z(Ɩc1Κk:מuCࢯ}LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNVARS / 10000) + '0', ((MONVARS MOD 10000) / 1000) + '0' DM 'K',CR,LF QMSG: DM '????' RSTMSG: DM 'RST ERR' OVLERRM DM CR,LFBNNNNNNNNNNNNNNNNNNP"NNNNNNNNNNNNNNNNNNNNN!**************** ; ; LIST DEVICE ; ;************************************** LO: ;OUTPUT CHAR IN C TO LINE PRINTER CALL NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNstatic unsigned bytsr, bytc; ;unsigned casi(count, staddr) unsigned count; char *staddr;{ ; return bytsr; ; } ; ENTRY- (SPVnrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LD C,3 ;WAIT 1.5 BITS BEFORE TESTING CALL DELAY NXTBIT: IN A,(IOSTAT) ;GET DATUM AND 1 SHL CASDATI RLCA ;PUT IN BIT NNNNNNNNNNNNNNNNNp^NNNNNNNNNNNNNNNNNNNNNNT2VAR: LD HL,4 ;FETCH PARAMETERS ADD HL,SP LD E,(HL) ;FETCH START ADDRESS INC HL LD D,(HL) INC HL PUSH DE `NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENTRY- (SP+2)= START ADDRESS PTR ; (SP+4)= BYTES TO WRITE COUNT ; ;********************************************************* NNNNNNNNNNNNNNNNN%0NNNNNNNNNNNNNNNNNNNNNNC) ;IF --BYTE_COUNT != 0 THEN LOOP DEC DE LD (BYTC),DE LD A,E OR D JR NZ,WMORE CALL LEADER ;ELSE WRITE TRAILER )$NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNM'. ;MOVES TO HIGH MEMORY, CHANGES COLD START VECTOR TO WARM START, THEN ;EXECUTES WARM START. ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!bNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,'OVERLAY ERR' SUBTTL PRIMITIVE I/O DRIVERS ;************************************** ; ; CONSOLE DEVICE ; ;***********&wNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNLSTAT ;IF BUSY THEN WAIT JR Z,LO LD A,CENTDST + ON ;INSURE STROBE IS FALSE (HIGH) OUT (IOSTBS),A LD A,C ;FETCH & OUTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!+2)= LOAD START ADDRESS PTR ; (SP+4)= BYTE COUNT (0: ENTIRE FILE) ; ;*******************************************************pNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!0 RLCA ADD D ;ADD TO PREVIOUS BITS RRCA LD D,A LD C,2 ;WAIT FOR 1 BIT CELL CALL DELAY DEC E ;BIT_COUNT-- zBNNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNLD E,(HL) ;FETCH COUNT INC HL LD D,(HL) LD (BYTC),DE POP HL ;P1 RET ;************************************** gNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNN***************** SUDO: CALL GET2VAR ;FETCH PARAMETERS FROM STACK CALL LEADER ;WRITE LEADER WMORE: LD E,9 ;BIT COUNT NNNNNNNNNNNNNNNNNN&eNNNNNNNNNNNNNNNNNNNNNN& RETURN XOR A RET ;**************************** ; ; WRITE LEADER SUBR ; EXIT - BC, D= 0 ; ;********************̨NNNNNNNNNNNNNNNNN,>NNNNNNNNNNNNNNNNNNNNN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! OVERLAY: ;OVERLAY GETS LOADED IN HERE DB -2 ;DUMMY OVERLAY # FORCES 1ST LOYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*************************** CI: ;RETURN NEXT AVAILABLE CHAR IN A PUSH HL LD HL,KBDIN CALL CALLROM POP HL RET CO:NNNNNNNNNNNNNNNNNN s-NNNNNNNNNNNNNNNNNNNNN!PUT DATA OUT (CENTOUT),A LD A,CENTDST + OFF ;OUTPUT DATA STROBE OUT (IOSTBS),A LD A,CENTDST + ON ;TURN OFF DATA STROBE dNNNNNNNNNNNNNNNNNNًNNNNNNNNNNNNNNNNNNNNNN******************* SUDI: CALL GET2VAR ;FETCH PARAMETERS FROM STACK PUSH HL LD HL,0 ;BYTES_READ = 0 LD (BYTSR),HL $NNNNNNNNNNNNNNNNN53NNNNNNNNNNNNNNNNNNNNNNJP NZ,NXTBIT LD (HL),D ;STORE IN MEMORY LD DE,(BYTSR) ;BYTES_READ++ INC DE LD (BYTSR),DE INC HL ;MEM_PTR++ ]BNNNNNNNNNNNNNNNNNN= (0FF00H - OVLSIZ)) r$rNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNAD CINIT: LD HL,AUXMEM ;TEST AUXILIARY RAM FOR STACK LOCATION LD BC,2048 LD SP,XRAMDON - ROM - 2 ;DUMMY STACK FOR NOW J NNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN ;OUTPUT CHAR IN C TO CONSOLE PUSH HL LD HL,VIDOUT CALL CALLROM POP HL RET CSTS: ;RETURN CONSOLE STATUS IN A (0H/NNNNNNNNNNNNNNNNN &~NNNNNNNNNNNNNNNNNNNNNN OUT (IOSTBS),A RET LSTAT: ;RETURN LINE PRINTER STATUS IN A (0:BUSY, -1:NOT) IN A,(IOSTAT) ;FETCH I/O STATUS CPL ;R=rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! POP HL ;START ADDRESS SKLEAD: IN A,(IOSTAT) ;WAIT FOR END OF LEADER AND 1 SHL CASDATI JR NZ,SKLEAD MORE: LD B,0 ;TINNNNNNNNNNNNNNNNNN``NNNNNNNNNNNNNNNNNNNNNN LD DE,(BYTC) ;IF --BYTE_COUNT == 0 THEN DONE DEC DE LD A,E OR D LD (BYTC),DE JR NZ,MORE SRDONE: LD HL,(BYTSR) ;RETNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DELAY: LD B,122 ;DELAY CONSTANT (76 FOR 2.5 MHZ) DELOOP: DEC B JP NZ,DELOOP DEC C ;IF --MULTIPLIER != 0 THEN LOOP JPaNNNNNNNNNNNNNNNNN"1NNNNNNNNNNNNNNNNNNNNN!;OUTPUT BIT RLCA ;SHIFT DATA TO BIT 3 FOR ADDRESSABLE LATCH RLCA RLCA ADD A,CASDATO OUT (IOSTBS),A POP AF ;RESTJNNNNNNNNNNNNNNNNN(FNNNNNNNNNNNNNNNNNNNNNNOR ($ <= 7FFFH) CONMSG **** Error - Code Collides With Overlay area (Too Big) **** ENDIF SUBTTL OVERLAY AREA ORG 0FF00NNNNNNNNNNNNNNNNNN.\NNNNNNNNNNNNNNNNNNNNNNP RAMTST - ROM DW XRAMDON - ROM XRAMDON: JR Z,AUXOK LD SP,STOP - ROM - 2 ;BEEP BUZZER JP BEEP - ROM DW STOP - ROM NNNNNNNNNNNNNNNNN6@NNNNNNNNNNNNNNNNNNNNNN: NOT READY, -1: READY) PUSH HL LD HL,KBDST ;IF NOT CHAR NOT READY THEN RETURN 0 CALL CALLROM POP HL RET ; ; KEYBNNNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNNEVERSE SENSE AND A,1 SHL CENTBSY ;IF BUSY THEN RETURN 0 RET Z LD A,-1 ;ELSE RETURN -1 RET ;***********************FNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMOUT = 256 TIMOUT: INC B JR Z,SRDONE ;TIMED OUT, NO MORE DATA IN A,(IOSTAT) ;IF DATUM == MARK THEN LOOP AND 1 SHL CAS_rNNNNNNNNNNNNNNNNNNSQNNNNNNNNNNNNNNNNNNNNN!URN BYTES_READ LD A,L ;SET FLAGS TO RETURN VALUE OR H RET ;************************************** ; ; FETCH 2 PA0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NZ,DELAY RET ;************************************************************************** ; ; SUDING CASSETTE WRITE ; NNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNORE DATA LD C,2 ;HOLD FOR 1 BIT CELL CALL DELAY RRA ;NEXT BIT DEC E ;IF --BIT_COUNT != 0 THEN LOOP JP NZ,WNXTBgNNNNNNNNNNNNNNNNN)uNNNNNNNNNNNNNNNNNNNNNNH - OVLSIZ ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; OVERLAY BUFFER HAS COLD START CODNNNNNNNNNNNNNNNNNNN/mNNNNNNNNNNNNNNNNNNNNNNSTOP: JR $ AUXOK: LD SP,AUXMEM + 2048 ;USE AUXILLIARY RAM FOR STACK LD HL,CHRMEM ;TEST CHARACTER RAM LD BC,2048 CALL f9NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNOARD INTERRUPT ROUTINE ; KEYSRV: PUSH HL LD HL,KBDINT CALL DISPATCH POP HL IRET: EI RETI ;**********************XNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN*************************************************** ; ; SUDING CASSETTE READ ; IMPLEMENTED AS A 'C' FUNCTION AS FOLLOWS: ;*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDATI JP NZ,TIMOUT LD DE,8 ;SET BIT COUNT WTSTRT: IN A,(IOSTAT) ;WAIT FOR SPACE AND 1 SHL CASDATI JP NZ,WTSTRT xNNNNNNNNNNNNNNNNNNCoNNNNNNNNNNNNNNNNNNNNNNRAMETERS FROM STACK SUBR ; ENTRY- (SP+4)= P1 ; (SP+6)= COUNT ; EXIT - HL= P1 ; ;************************************** GEoNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! IMPLEMENTED LIKE A 'C' FUNCTION AS: ;static unsigned bytc; ;caso(count, staddr) unsigned count; char *staddr;{ ; } ; ; dNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNT LD A,CASDATO + ON ;ELSE WRITE 2 STOP BITS (1) OUT (IOSTBS),A LD C,4 CALL DELAY INC HL ;MEM_PTR++ LD DE,(BYTNNNNNNNNNNNNNNNNN* NNNNNNNNNNNNNNNNNNNNNNE ON RESET ;EXECUTES DIAGNOSTICS UPON COLD RESET FROM PAGE 0 OF ROM, ALL ABSOLUTE ;REFERENCES MUST BE REFERENCED BY 'NAME - RO$]NNNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNRAMTST - ROM JR Z,CHROK LD B,2 ;2 BEEPS = VIDEO CHARACTER RAM ERROR CALL BEEPS - ROM CHROK: LD HL,ATTMEM ;TEST ATTRI NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNρl: ׅuC}L鍷T#]+ʖh7Ԛq@ݞ{I梵T"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBUTE MEMORY LD BC,2048 CALL RAMTST - ROM JR Z,ATTOK LD B,3 CALL BEEPS - ROM ATTOK: LD A,(VIDINIT) ;IF I/O ROM NOTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNUSH HL ;SAVE RAM FAILURE ADDRESS LD HL,RAMMSG - ROM CALL POUT - ROM POP HL ;ADDRESS CALL OUTW - ROM JR $ ;FATAL ERR5NNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNNOM COLD TO WARM START LD (ROM + 1),HL JP ROM MONERR: PUSH HL ;OUTPUT ERROR ADDRESS PUSH DE PUSH HL LD HL,MONERM NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNC A JR NZ,BEEP3 RET ;************************************** ; ; PRIMITIVE OUTPUT SUBR ; ENTRY- HL= TXT PTR (>1270NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN************** ; ; NON DESTRUCTIVE RAM TEST SUBR ; ENTRY- HL= RAM PTR ; BC= COUNT ; EXIT - ZF= OK, NZ= BAD RAM ; HL= BL $NNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNNVIDOUT ;**************************** ; ; OUTPUT HEX BYTE SUBR ; ENTRY- A= BYTE ; ;**************************** OUTB̘BNNNNNNNNNNNNNNNNN%q"NNNNNNNNNNNNNNNNNNNNN!F00H ;###################################### ; ; INTERRUPT VECTOR TABLE ; ;###################################### INTTBL: $NNNNNNNNNNNNNNNNNN+R-NNNNNNNNNNNNNNNNNNNNN!********************************************** ; ; TBL CONTAINS THE OVERLAY NUMBERS OF THE COMMANDS. ; THE EXECUTIVE USES IT gNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNN THERE THEN ERROR CP 0C3H JR Z,IOROMOK LD B,4 CALL BEEPS - ROM JR $ IOROMOK: CALL VIDINIT ;INIT VIDEO OUTPUT eNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOR, GO NO FURTHER URAMOK: LD SP,0 ;TEST UPPER RAM CALL TSTLOW - ROM JR NZ,RAMERR LD C,BELL ;ANNOUNCE FINISH CALL NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN- ROM CALL POUT - ROM POP HL CALL OUTW - ROM CALL OUTSPC - ROM POP DE POP HL LD A,(DE) XOR (HL) CALL OUTBH - R>NNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN=LAST) ; ;************************************** POUT: LD C,(HL) PUSH HL RES 7,C CALL VIDOUT POP HL BIT 7,(HL) ;IFbNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNAD RAM PTR ; ;************************************** RAMTST: LD A,(HL) ;FETCH BYTE CPL ;COMPLEMENT IT LD (HL),A ;STORNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNH: CALL OUTB - ROM JR OUTH OUTB: CALL PRDIG - ROM PRDIG: RLCA ;START WITH UPPER NIBBLE RLCA RLCA RLCA PUSH AF ;ANNNNNNNNNNNNNNNNNN&$qNNNNNNNNNNNNNNNNNNNNNN DW IRET ;SIOB TX DW IRET ;SIOB EXTERNAL/STATUS DW IRET ;SIOB RX DW IRET ;SIOB SPECIAL RX CONDITION DW IRET ;SIOA TX 3NNNNNNNNNNNNNNNNN,˺NNNNNNNNNNNNNNNNNNNNN!TO LOOK UP THE DESIRED OVERLAY. ; ;********************************************************** TBL: DB -1 ;A DB BOOTCO ;BoNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNN IN A,(SENSE) ;IF SW1 SET THEN FILL DISPLAY WITH CHARS BIT SW1,A JR NZ,NOCHRS ; ; FILL SCREEN WITH INCREMENTING CHARS @NNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNNVIDOUT IN A,(SENSE) ;IF SW1 SET THEN CONTINUOUS DIAGNOSTIC BIT SW1,A JP Z,0 ; ; DIAGNOSTICS OVER, MOVE MONITOR TO NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOM JR $ ;************************************** ; ; BEEP SUBR ; ;************************************** BEEPS: PUSNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNN CHAR > 127 THEN DONE RET NZ INC HL JR POUT ;************************************** ; ; TEST LOW RAM SUBR ; ;**BNNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNE IT CP (HL) ;TEST IT CPL ;RESTORE IT LD (HL),A RET NZ ;IF BAD THEN RETURN INC HL ;NEXT LOCATION DEC BC LD UNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNSAVE VALUE AND 0FH ;MASK OFF OTHER NIBBLE CP 10 ;IF > 9 THEN CONVERT TO A..F JR C,NTALPH ADD 7 NTALPH: ADD '0' ;CONVNNNNNNNNNNNNNNNNNN'@NNNNNNNNNNNNNNNNNNNNNNDW IRET ;SIOA EXTERNAL/STATUS DW IRET ;SIOA RX DW IRET ;SIOA SPECIAL RX CONDITION CTCAV: DW KEYSRV ;KEYBOARD DW IRET ;I>NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNot DB CLOCKCO ;Clock set/display DB DISPO ;Display DB -1 ;E DB FILLO ;Fill memory DB GOTOO ;Goto address DB HELNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN; LD DE,80 * 23 LD C,' ' VIDTLP: PUSH BC PUSH DE CALL VIDOUT POP DE POP BC INC C ;NEXT CHAR LD A,7EH ;IF NEW "$NNNNNNNNNNNNNNNNN gNNNNNNNNNNNNNNNNNNNNNNHIGH MEMORY & EXECUTE ; LD SP,ROM - 100H ;PUT STACK BELOW MONITOR TEMPORARILY LD HL,0 LD DE,ROM ;PUT MONITOR AT F800 L6'NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNN!H BC ;SAVE COUNT CALL BEEP - ROM ;DO 1 BEEP POP BC ;IF --COUNT != 0 THEN REPEAT DJNZ BEEPS RET BEEP: LD A,BUZZE"NNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN************************************ TSTLOW: LD HL,TSTLOW - ROM ;MOVE THIS CODE TO HIGH MEMORY LD DE,TSTLOW LD BC,TLSIZ uNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNA,C OR B JR NZ,RAMTST RET TLSIZ EQU $ - TSTLOW ;SIZE OF CODE NEEDED TO TEST LOW BANK ;****************************)NNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNERT TO ASCII LD C,A CALL VIDOUT POP AF ;RESTORE DATA RET ;**************************** ; ; OUTPUT SPACE SUBR NNNNNNNNNNNNNNNNN(~NNNNNNNNNNNNNNNNNNNNN!NDEX PULSE DW IRET ;SIOA SYNC DW IRET ;VERTICAL SYNC INTERVAL CTCBV: DW IRET ;SIOB BAUD RATE (NOT USED) DW IRET ;SIOA B PRINTABLE THEN RE-INIT TO ' ' CP C JR NC,VIDLP1 LD C,' ' VIDLP1: DEC DE ;COUNT-- LD A,E OR D JR NZ,VIDTxBNNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNND BC,2048 ;2K ZMON LDIR LD HL,0 ;TEST LOAD LD DE,ROM LD BC,2048 MONTST: LD A,(DE) CP (HL) JR NZ,MONERR INC rNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNR + ON ;TURN ON BUZZER OUT (PORT0),A LD BC,0 ;DELAY ON TIME BEEP2: DEC C JR NZ,BEEP2 DJNZ BEEP2 LD A,BUZZER + ~9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LDIR JP TSTLO1 ;EXECUTES NEXT INSTRUCTION IN HIGH MEMORY TSTLO1: LD A,DYSTAT + ON ;TURN ON RAM OUT (PORT0),A LD HL,0 I&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********** ; ; OUTPUT HEX WORD SUBR ; ENTRY- HL= WORD ; ;************************************** OUTW: LD A,H ;START WIT4$NNNNNNNNNNNNNNNNNN#ۄNNNNNNNNNNNNNNNNNNNNNN; ;**************************** OUTSPC: LD C,' ' JP VIDOUT RAMMSG: DM CR,LF,'RAM ERROR AT ' MONERM: DM CR,LF,'MONITOR LO!NNNNNNNNNNNNNNNNN)4ONNNNNNNNNNNNNNNNNNNNN!AUD RATE (NOT USED) DW MILISEC ;REAL TIME CLOCK MILLISECOND TIMER DW TIMER ;REAL TIME CLOCK TICK DMAVEC: DW IRET ;DMA REAѤNNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNDB OUPTO ;Output DB -1 ;P DB -1 ;Q DB READCO ;Read disk DB SUBSO ;Substitute memory DB MTESTO ;Test memory DB i9NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNLP ; ; TEST RAM ; NOCHRS: LD HL,8000H ;START WITH UPPER 32K LD BC,8000H CALL RAMTST - ROM JR Z,URAMOK RAMERR: P5sBNNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNNHL INC DE DEC BC LD A,C OR B JR NZ,MONTST CALL VIDINIT ;CLEAR SCREEN FOR MONITOR LD HL,INIT ;CHANGE ENTRY FR/[NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!OFF ;TURN OFF BUZZER OUT (PORT0),A LD A,2 ;DELAY OFF TIME BEEP3: DEC C ;BC NOW = 0 JR NZ,BEEP3 DJNZ BEEP3 DE?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;TEST LOW RAM LD BC,2048 CALL RAMTST LD A,DYSTAT + OFF ;TURN ON ROM OUT (PORT0),A RET ;************************NNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNH HIGH BYTE PUSH HL CALL OUTB - ROM POP HL LD A,L ;FALL THROUGH WITH LOW BYTE CALL OUTB - ROM OUTH: LD C,'H' JP 3NNNNNNNNNNNNNNNNNN$BNNNNNNNNNNNNNNNNNNNNNNAD ERROR AT ' IF ($ >= 0FF00H) OR ($ < 7FFFH) CONMSG **** COLD BOOT CODE RUNS INTO INTERRUPT TABLE **** ENDIF ORG 0FG9NNNNNNNNNNNNNNNNN*aNNNNNNNNNNNNNNNNNNNNNNDY DW IRET ;DMA MATCH DW IRET ;DMA END_OF_BLOCK DW IRET ;DMA MATCH/END SUBTTL CONSTANTS DS 0FF30H - $ ;************"NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNUNLDCO ;Unload cassette (write) DB COMPO ;Verify memory DB WRITCO ;Write disk DB XMNEO ;Xamine registers DB -1 ;Y VyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁi7ՅrAމ|K荶S"𑿒\*Ȗe3Кn= ڞwE⢱ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN DB BYEO ;Zleep ;--------------------------------------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; STRUCTcNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN! TB 'B',0,BPLOC,0 TB 'C',0,CPLOC,0 TB 'D',0,DPLOC,0 TB 'E',0,EPLOC,0 TB 'F',0,FPLOC,0 TB 'H',0,HPLOC,0 TB 'L',0,LPLNNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNDE DB 128 ;/128 = 300 BAUD DB 2,CTCB1 ;CTC B1 IN COUNTER MODE & 300 BAUD DB 01000111B DB 128 DB 2,CTCB2 ;RTC DIBNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNYTE CONTAINING THE OVERLAY OFFSET NUMBER AND THE ;CODE MUST START AT THE 2ND BYTE OF THE OVERLAY. ; ;!!!!!!!!!!!!!!!!!!!!!!!!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DW READC READCO EQU 16 DW WRITC WRITCO EQU 17 DW HELPC HELPCO EQU 18 ;---------------------------------------------$NNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNC,FIOC LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO FIOC: POP DE ;RESTORE SP IN CAS NNNNNNNNNNNNNNNNN%FNNNNNNNNNNNNNNNNNNNNNN BYE1 RET ;--------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTIpdNNNNNNNNNNNNNNNNNN+eNNNNNNNNNNNNNNNNNNNNNN;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;-----------------------------------------`NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNURE- BYTE= REGISTER CHAR ; BIT 7= NEW LINE IF PRINTOUT ; WORD= ADDRESS OF VALUE ; BIT 7= 0: BYTE, 1: WORD VALUE ; BITjNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!OC,0 TB 'M',1,LPLOC,11000000B TB 'X',0,XLOC,10000000B TB 'Y',0,YLOC,10000000B TB 'R',0,RLOC,0 DB -1 ;############NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNVISOR = 1MS DB 00000111B DB 250 DB 2,CTCB3 ;RTC TICK, INTERRUPT EVERY 250MS DB 11000111B DB 250 DB -1 IF $ xNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ORG 0800H ;REALLY 0800H OBASE EQU $ ;###################################### NNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNN------------------ ; ; ERROR OVERLAY ; ;--------------------------------------------------------------- OERROR: DB ERRORO 1NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNE STACK JP WINIT ; WAS OVERWRITTEN ;--------------------------------------------------------------- ; ; SLEEP COMMANDxNNNNNNNNNNNNNNNNNN&ANNNNNNNNNNNNNNNNNNNNNNNE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH ; OTHER. IF A DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS ; DETECTED, THE ADD5. NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!---------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE ; CONSOLE DEVICE. THEXNNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN 6= 0: DIRECT, 1: INDIRECT VALUE ; ;--------------------------------------------------------------- TB MACRO #REG,#M,#ADDR,#AnNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN################ ; ; I/O DEVICE INIT TABLE ; ;############################ IOTABL: DB 2,PORT3 ;TTL BIT LATCHES DB ATTyNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN< 7FFFH CONMSG **** Error - Code Exceeds FFFFH **** ENDIF SUBTTL MONITOR OVERLAYS ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!{NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN ; ; TABLE OF POINTERS TO THE OVERLAYS ; ;###################################### DW OERROR ;0= ERROR OVERLAY (-2 FOR OVE*NNNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNN;OVERLAY # ;--------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FIe9NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE ; OF THE SYSTEM. THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ; ANaNNNNNNNNNNNNNNNNNN' pNNNNNNNNNNNNNNNNNNNNNNRESS OF THE 1ST BLOCK IS DISPLAYED, ALONG ; WITH IT'S CONTENTS & THE CONTENTS OF THE OTHER BLOCK'S SAME ; RELATIVE ADDRESS. rNNNNNNNNNNNNNNNNN-ϻNNNNNNNNNNNNNNNNNNNNNN USER MUST SPECIFY THE START & FINISH ; ADDRESSES. THE DISPLAY IS ORGANIZED TO DISPLAY UP TO 16 ; BYTES PER DISPLAY LINE, WIQNNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNN!M DB #REG + (#M * 80H), LOW #ADDR, (HIGH (#ADDR AND 0FFFH)) + #AM ENDM ACTBL: TB 'A',1,ALOC,0 TB 'B',0,BLOC,0 TB 'C',NNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNN!EN + ON DB FDCRST + ON DB 1,SELMUX DB 00001010B ;DRIVES OFF, TEST= FALSE, RDY SELECT= DRQ DB 6,DMA ;RESET OF DMA PĚNNNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; THE FOLLOWING CODE RESIDES IN THE 2ND HALF OF THE 32K EPROM. ;IT STARTS WITH A TABLE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRLAY #) ERRORO EQU 0 DW FILL FILLO EQU 1 DW BYE BYEO EQU 2 DW COMP COMPO EQU 3 DW DISP DISPO EQU 4 DW GOTO GOTOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LLS A BLOCK OF MEMORY WITH A USER ; DEFINED CONSTANT. IT EXPECTS 3 PARAMETERS TO BE ENTERED IN ; THE FOLLOWING ORDER: ; STA!9NNNNNNNNNNNNNNNNN"߅NNNNNNNNNNNNNNNNNNNNNNYTHING OTHER THAN 2 ASCII BELL CHARACTERS. WHEN IT SEES ; THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE MONITOR ; WITHOUT AQFNNNNNNNNNNNNNNNNN(0NNNNNNNNNNNNNNNNNNNNNNN ; ; V ; ;---------------------------------------------------------vNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNTH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;-----g4!NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN0,CLOC,0 TB 'D',0,DLOC,0 TB 'E',0,ELOC,0 TB 'F',0,FLOC,0 TB 'H',0,HLOC,0 TB 'L',0,LLOC,0 TB 'M',1,LLOC,11000000B TbNNNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNNR ZILOG REPT 6 DB 11000011B ENDM DB 1,CTCA0 ;KEYBOARD DB (LOW CTCAV) AND 11111000B DB 2,CTCA1 ;INDEX PULSES NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN!OF POINTERS TO EACH OVERLAY, (FOLLOWED BY ;AN EQUATE TO THE OFFSET OF THE POINTER TO LINK TO THE COMMAND ;LOOKUP TABLE), FOLLONNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN EQU 5 DW INPT INPTO EQU 6 DW OUPT OUPTO EQU 7 DW MOVE MOVEO EQU 8 DW BOOTC BOOTCO EQU 9 DW SUBS SUBSO EQU 10 D%NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNRT ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;--------------------------------------------NNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!LTERING ANYTHING. ; ; Z ; ;--------------------------------------------------------------- BYE: DB BYEO BYE2: LD B,INNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN------ COMP: DB COMPO CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOU$BNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------- DISP: DB DISPO CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB 'P',0,PLOC,10000000B TB 'S',0,SLOC,10000000B TB 'I',0,ILOC,0 ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: TB 'A',1,APLOC,0 ߼NNNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNN!DB 01000111B ;COUNT INDEX PULSES MOD 256 DB 0 DB 3,CTCB0 ;CTC B DB (LOW CTCBV) AND 11111000B DB 01000111B ;COUNTER MONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWED BY THE COMMAND OVERLAY ITSELF. OVERLAYS ;WILL NOT BE LONGER THAN 512 BYTES AT THIS TIME. THE OVERLAYS ;MUST START WITH A B*NNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNW MTEST MTESTO EQU 11 DW XMNE XMNEO EQU 12 DW LOADC LOADCO EQU 13 DW UNLDC UNLDCO EQU 14 DW CLOCKC CLOCKCO EQU 15 #NNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN------------------- FILL: DB FILLO CALL EXPR3 ;GET 3 PARAMS FIO: LD A,H ;PROTECT MONITOR CODE CP HIGH MONVARS JR NNNNNNNNNNNNNNNNNNN$u#NNNNNNNNNNNNNNNNNNNNNN2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE2 CALL ECH1 ;ECHO THE BELL DJNZTNNNNNNNNNNNNNNNNN*V,NNNNNNNNNNNNNNNNNNNNNNRCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 3NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP - DISP + OVERLAY ;SKIP OVER TO RIGHT COLUMN PUSH HL lnHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNN΁k9ՅsB߉{J獴Q Z(ǖf4њn= ڞxF㢳PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNN DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMgNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN*************** TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B ЏBNNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNNDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT ABNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNET TRAP ADDRESS FROM USER POP DE POP HL ;PTR LD A,D ;IF BREAKPOINT SPECIFIED AS 0 THEN IGNORE OR E JR Z,GO2 dHNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNG RESTORE & EXECUTE GOTO ;--------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; pk!NNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------------------------------8rNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!.255} ; ;------------------------------------------------ BOOTC: DB BOOTCO ; ; CHECK FOR DRIVE NUMBER ; CALL PCHK ;IFj NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN----------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY ; LOCATNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT S NNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNN!;**************************** ; ; OUTPUT N SPACES SUBR ; ENTRY- A= #_SPACES ; EXIT - B= 0 ; ;***************************UNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;--------------------(NNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNN!LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CT!NNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNN! ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM ; THE CURRENT CONSOLE DEVICE. ; ; I ; ;-----------NNNNNNNNNNNNNNNNN Z9NNNNNNNNNNNNNNNNNNNNNN------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE ; FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN NO FURTHER INPUT THEN USE DEFAULT LD C,0 ;DEFAULT TO 0 JR C,BOOTCD ; ; GET DRIVE NUMBER ; CALL EXF ;GET USER BOOT :NNNNNNNNNNNNNNNNN,TNNNNNNNNNNNNNNNNNNNNNNION & ALTER THE CONTENTS, IF DESIRED & IF THE ADDRESS ; IS IN RAM. THE CONTENTS MAY BE LEFT UNALTERED BY ENTERING A ; SPACE,5NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNPACE AND 0FH CALL TRPL2 - DISP + OVERLAY DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT 3zNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNNN* TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;--------------------------------------------g9NNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------- GOTO: DB GOTOO CALL PCHK ;IF NO ARGS THEN EXIT JR C,GO3 JR }rNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC ;COUNT JR Z,GO3 DJNZ GO1 }NNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------- INPT: DB INPTO CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT $NNNNNNNNNNNNNNNNN!iNNNNNNNNNNNNNNNNNNNNNNDR, SOURCE LAST BYTE ADDR & ; DESTINATION 1ST BYTE ADDR. ; ; M ; ;-------------SNNNNNNNNNNNNNNNNNN'îNNNNNNNNNNNNNNNNNNNNNN# POP BC ; ; PASS DRIVE NUMBER TO COLD BOOT ROUTINE IN ROM ; BOOTCD: LD HL,DKBOOTV CALL CALLROM ; ; CURRENTLY, IF rNNNNNNNNNNNNNNNNN-,eNNNNNNNNNNNNNNNNNNNNNN COMMA OR RETURN. IF A RETURN IS ENTERED, THE ROUTINE ; IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ROUTINE ; PROCEEDY5INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,r[ NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN-------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS ; IT ALLOWS THNNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNNZ,GO0 ;ELSE IF DELIM. (NO START ADDR) THEN EXIT ; ; EXECUTION ADDRESS SPECIFIED ; CALL EXF ;GET NEW GOTO ADDR POP HL #$NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;ELSE IF <2 BPS THEN LOOP ; ; GOTO ADDRESS & BREAKPOINTS TAKEN CARE OF ; GO3: CALL CRLF ;NEW LINE FOR PGM DI ;DISAB+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDATA ON NEW LINE POP BC IN E,(C) ;FETCH DATA LD B,8 ;BIT COUNT INPT1: LD A,E ;OUTPUT BINARY BITS RLCA LD E,A9NNNNNNNNNNNNNNNNNNN"<[NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------- MOVE: DB MOVEO CALL EXPR3 MOV1: LD A,B ;PROTECT MONITOR ENVIRONMENT CP 7NNNNNNNNNNNNNNNNN(ӐNNNNNNNNNNNNNNNNNNNNNNROM RETURNS THEN A != 0, SO ALLWAYS ERROR. HOOKS ARE HERE ; NOW FOR USER TO CODE UP A RETURN WITHOUT ERROR. ; OR A RET ZNNNNNNNNNNNNNNNNNN.y6NNNNNNNNNNNNNNNNNNNNNNS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;----------------------------NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP)%rNNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNNE SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS ; WELL AS ALLOWING ANY CONSOLE INPUT TO BREAKPONT THE RUN, AS ; LONG AS INTERR0NNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNN! LD (PLOC),HL ;PUT ADDR IN PC LOCATION LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 ; ; BREAKPOINTS SPECIFIED ; GaNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNLE INTERRUPTS WHILE MESSING WITH REGS POP HL ;COMMAND RETURN ADDRESS LD HL,RS9 ;PUT TRAP FOR STACK UNDERRUN ON STACK tHNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN LD A,'0' / 2 RLA LD C,A CALL CONOUT DJNZ INPT1 RET ;-------------------------------------- ; ; OUTPUT DATAY dNNNNNNNNNNNNNNNNNN#jNNNNNNNNNNNNNNNNNNNNNNHIGH MONVARS RET NC LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB ;RETURNS TO COMMAND INPUT IF DONE JR MOV1 ;-NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN ; ; ERROR RETURNED, OUTPUT MESSAGE & STATUS WORD ; PUSH AF LD HL,BOOTM - BOOTC + OVERLAY CALL PRTWD POP AF CALL [NNNNNNNNNNNNNNNNNNN/JNNNNNNNNNNNNNNNNNNNNNN----------------------------------- SUBS: DB SUBSO CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: NNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNN! - DISP + OVERLAY JR DIS3 ;**************************** ; ; COMPUTE COLUMN SUBR ; ENTRY- A=COLUMN ; ;*************aNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_AD*NNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 ;G NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PUSH HL LD HL,REST ;PUT BREAKPOINT ENTRY PTR INTO TRAP VECTOR LD (9),HL POP DE ;ADJUST STACK JP EXIT ;GO DO RENNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN TO PORT COMMAND ; ; O ; ;-------------------------------------- OUPT: DB OUPTO CALL EXPNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------- ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B {0.yUNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNHEX1 JP CRLF ; ; BOOT LOAD ERROR MESSAGE ; BOOTM: DM CR,LF,'Boot Load Error - ' ;----------------------------------5NNNNNNNNNNNNNNNNNN0YJNNNNNNNNNNNNNNNNNNNNNNLD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 .aHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNˁi7ԅrA߉}L鍶S"^,ʖg6Ԛq@ݞzH墴R NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN;IF CHAR = ' ' OR ',' THEN SKIP STORE CP LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE BNNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN------------ MTEST: DB MTESTO CALL EXLF MTEST1: LD A,(HL) LD B,A ;SAVE ORIGINAL CPL LD (HL),A XOR (HL) ;RESULT?NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLUES OF THE ; REGISTERS STORED BY THE LAST ENCOUNTERED BREAKPOINT. THE ; VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DI! 9NNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN FOUND REGISTER REQUESTED IN TABLE ; XAC: PUSH BC ;CHAR IN B CALL BLK ;OUTPUT SPACE CALL PRTVAL ;OUTPUT CURRENT VALUIHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT NNNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN----------- LOADC: DB LOADCO CALL EXPR1 ;GET LOAD ADDRESS LD HL,0 ;0 LOADS THE ENTIRE FILE (<=65,536 BYTES) EX (SP),H NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN------------------- ; ; DISPLAY & SET REAL TIME CLOCK COMMAND ; ;C ;DISPLAY TIME ;Chours minutes [seconds] ;SET TIME (M6NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN CALL HEX1 CALL CLKEI - CLOCKC + OVERLAY JP CRLF CLKSET: CALL EXF ;GET HOURS FROM USER POP BC POP HL LD (HL),C NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUBNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN SHOULD BE 0 LD (HL),B ;RESTORE ORIGINAL DATA CALL NZ,BITS - MTEST + OVERLAY ;LOG ERR IF NOT MTEST2: CALL HILOX JR MTEHNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNSPLAY 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 ; ;d= HEX NUMBER TO PLAdNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNN!E CALL DASH ;OUTPUT '-' CALL PCHK ;GET NEW INPUT POP BC ;CHAR IN B RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF ENNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNJR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H ;STORE HIGH BYTE LD (DE),A XE: POP HL ;TABLE PTR XF: LD gkNNNNNNNNNNNNNNNNN m NNNNNNNNNNNNNNNNNNNNNNL ;SHOVE UNDER STACK RETURN ADDRESS PUSH HL CALL SUDI ;READ IT POP DE ;BALANCE STACK EX (SP),HL ;SAVE ACTUAL COUuNNNNNNNNNNNNNNNNNN&ǯNNNNNNNNNNNNNNNNNNNNNNSECONDS OPTIONAL) ; ;-------------------------------------------------------------------- CLOCKC: DB CLOCKCO DI ;DISABLb$NNNNNNNNNNNNNNNNN,(dNNNNNNNNNNNNNNNNNNNNNN DEC HL PUSH HL CALL PCHK ;IF NO MINUTES THEN ERROR POP HL JR C,CLKQ PUSH HL ;GET MINUTES CALL EXF POP BC yNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNN!2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR ]NNNNNNNNNNNNNNNN wNNNNNNNNNNNNNNNNNNNNN!ST1 ;******************************************* ; ; BITS SUBR OUTPUTS ADDRESS & BINARY DATA ; ENTRY- E= DATA ; HL= AЂNNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNCE INTO REGISTER r ; ;------------------------------------------------------------------------- XMNE: DB XMNEO JR XMNE0 ONNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNN!NO CHANGE THEN EXIT PUSH HL ;PTR LD C,A ;SAVE 1ST DIGIT LD A,B ;TEST FOR 'M' CP 'M' PUSH AF LD A,C ;RESTORE NNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNN!A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE0: LD HL,ACTBL ;ADDR OF REG NNNNNNNNNNNNNNNNN!^8NNNNNNNNNNNNNNNNNNNNNNNT LD HL,RDMSG - LOADC + OVERLAY ;OUTPUT BYTES READ CALL PRTWD POP HL ;OUTPUT ACTUAL BYTES READ JP LADR RDMSG: DNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN!E INTERRUPTS TO PREVENT SKEW LD A,(MONSTAT) LD (TEMP),A RES INTSTAT,A LD (MONSTAT),A CALL GETCLKP ;FETCH ARRAY PTR 9NNNNNNNNNNNNNNNNN-UNNNNNNNNNNNNNNNNNNNNNNPOP HL LD (HL),C DEC HL PUSH HL CALL PCHK ;IF NO SECONDS THEN ASSUME 0 LD C,0 JR C,CLKSEC CALL EXF ;ELSE GETxNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN CALL Z,LADRB JR SUB1 ;--------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPE8FNNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNN!DDRESS ; ;******************************************* BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR LD B,8 ;BIT COUNvsNNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNN;VECTOR ; ; GOT ARGS: DISPLAY CURRENT VALUE & ACCEPT & SET NEW VALUE ; XA: LD B,A ;SAVE ARG CHAR XAA: LD A,(HL) ;FETCHΐ NNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN1ST DIGIT CALL EXF ;GET NEW VALUE ON STACK POP HL ;FETCH NEW VALUE FROM STACK POP AF ;IF NOT 'M' THEN NO REDIRECTION TNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNLOOK-UP TABLE XMNE1: CALL PCHK JP C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP ̪NNNNNNNNNNNNNNNNN" kNNNNNNNNNNNNNNNNNNNNNNM 'READ= ' ;---------------------------------------------------------- ; ; UNLOAD (WRITE) CASSETTE TAPE COMMAND ; ;U(COgNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNNOW INC HL ;POINT TO HOURS INC HL PUSH HL CALL PCHK ;IF NO INPUT THEN DISPLAY JR NC,CLKSET ;ELSE SET CALL CRLFINNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNN SECONDS POP BC CLKSEC: POP HL LD (HL),C JR CLKEI CLKQ: CALL CLKEI - CLOCKC + OVERLAY JP QPRT ;**************wNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!CIFIED BLOCK OF MEMORY TO SEE ; IF ANY HARD DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE ; TEST, BUT JUST A QUICK INDICAuNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RETruNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN TABLE CHAR INC A ;IF END OF TABLE (-1) THEN ERROR JP Z,QPRT DEC A AND 7FH ;REMOVE NEWLINE BIT CP B ;IF CHAR == A\NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JR NZ,NOREDIR ; ; 'M' SPECIFIED, USE CURRENT VALUE AS POINTER TO VALUE ; PUSH HL ;NEW VALUE LD A,(DE) ;FETCH PTR VALNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ;-------------------------------------------------------dNNNNNNNNNNNNNNNNNN#8ZNNNNNNNNNNNNNNNNNNNNNNUNT) (START_ADDRESS) ; ;---------------------------------------------------------- UNLDC: DB UNLDCO CALL EXPR ;GET COUNT &gNNNNNNNNNNNNNNNNN)בNNNNNNNNNNNNNNNNNNNNNN ;DISPLAY TIME ON NEW LINE POP HL ;HOURS PTR LD A,(HL) ;OUTPUT HOURS (HEX IS OK) CALL HEX1 LD C,':' ;OUTPUT DELIMIkNNNNNNNNNNNNNNNNNN/}7NNNNNNNNNNNNNNNNNNNNNN************************ ; ; RESTORE INTERRUPT STATUS SUBR ; ;************************************** CLKEI: LD A,(TEMP) ;KlyNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNTION OF THE MEMORY'S ; OPERATIVENESS. ; ; T ; ;--------------------------------------------------- NNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNN ;------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND INSPECTS THE VA$HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRG THEN FOUND JR Z,XAC INC HL ;NOT THIS ENTRY, SKIP TO NEXT ENTRY. CHAR INC HL ;ADDRL INC HL ;ADDRH JR XAA ; ; NNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNN!UE LD L,A INC DE LD A,(DE) LD H,A POP DE LD (HL),E ;STORE NEW VALUE JR XE NOREDIR: LD A,L ;STORE NEW VALUE NNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN!--- ; ; LOAD COMMAND READS THE SUDING CASSETTE TAPE ; ;L(START_ADDRESS) ; ;-----------------------------------------------NNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN ADDRESS CALL CRLF CALL SUDO POP HL ;BALANCE STACK POP HL RET ;-------------------------------------------------'NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNTER CALL CO DEC HL ;OUTPUT MINUTES LD A,(HL) CALL HEX1 LD C,':' CALL CO DEC HL ;OUTPUT SECONDS LD A,(HL) iNNNNNNNNNNNNNNNNNN0nzNNNNNNNNNNNNNNNNNNNNNNRESTORE INTERRUPT STATUS LD (MONSTAT),A BIT INTSTAT,A RET Z EI RET ;-------------------------------------- ; ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNρm; ׅtB߉{I捴Q [)Ȗe3Кm< ؞uCᢰ~LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNN! READ SECTOR COMMAND ; ;Raddress drive track sector ; ;-------------------------------------- READC: DB READCO ; ; GETNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL PRTWD POP AF ;OUTPUT ERROR CODE CALL HEX1 JP CRLF ; ; MOVE DATA TO USER REQUESTED AREA ; DKOPOK: LD HL,DBUFFNNNNNNNNNNNNNNNNNN \7NNNNNNNNNNNNNNNNNNNNNN ; MOVE REQUESTED DATA TO BUFFER WHERE ROM CAN ACCESS IT ; POP HL ;SOURCE ADDRESS LD DE,DBUFF ;MOVE REQUESTED DATA TO BUNNNNNNNNNNNNNNNNNN |KNNNNNNNNNNNNNNNNNNNNNNtitute(address)[ ]' DB CR,LF,'Fill(first) (last) (data) Move(first) (last) (destination)' DB CR,LF,'Test(first) (last) NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN 9&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN %xNNNNNNNNNNNNNNNNNNNNN!is ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelNNNNNNNNNNNNNNNNNN +wNNNNNNNNNNNNNNNNNNNNNNt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4BNNNNNNNNNNNNNNNNN L NNNNNNNNNNNNNNNNNNNNN! REQUIRED USER COMMANDS ; LD B,4 CALL EXPR ; ; SET UP THE IOPB ; LD A,RDSCMD ;READ COMMAND LD (PBCMD),A ; XOR AgNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;MOVE SECTOR DATA TO REQUESTED AREA LD BC,128 LDIR RET ;-------------------------------------- ; ; WRITE SECTOR NNNNNNNNNNNNNNNNNNN  dNNNNNNNNNNNNNNNNNNNNNNFFER LD BC,128 LDIR ; ; EXECUTE THE IOPB ; LD DE,IOPB ;PASS THE IOPB PTR LD HL,XCUTE ;PASS THE EXECUTION VECTOR 94 NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN Verify(first) (last) (other first)' DB CR,LF,'Input(port) Output(port) (data)' DB CR,LF,'Load(address) NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN &+NNNNNNNNNNNNNNNNNNNNNNease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,NNNNNNNNNNNNNNNNN ,iNNNNNNNNNNNNNNNNNNNNNNot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi`rNNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNN,A ;INIT FLAGS LD (PBFLG),A ; LD (PBSTAT),A ;CLEAR ERRORS ; POP HL ;SECTOR LD (PBSEC),HL ; POP HL ;TRACK LD (PNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCOMMAND ; ;Waddress drive track sector ; ;-------------------------------------- WRITC: DB WRITCO ; ; GET REQUIRED PARANNNNNNNNNNNNNNNNNN :UNNNNNNNNNNNNNNNNNNNNNNCALL CALLROM ; ; IF NO ERRORS THEN RETURN ; OR A RET Z ; ; ELSE OUTPUT WRITE ERROR ; PUSH AF ;SAVE ERROR STATUS<NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN Unload(address)' DB CR,LF,'Boot[drive]' DB CR,LF,'Read(address) (drive) (track) (sector)' DB CR,LF,'Write(addNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNN! TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMNNNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to urNNNNNNNNNNNNNNNNN -ZNNNNNNNNNNNNNNNNNNNNNNnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; VERSN EQU '18' ZAHNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNBTRK),HL ; POP HL ;DRIVE LD A,L LD (PBDRV),A ; LD HL,DBUFF ;XFER ADDRESS LD (PBDMA),HL ; ; EXECUTE THE IOPB ; +NNNNNNNNNNNNNNNNN ŠNNNNNNNNNNNNNNNNNNNNNNMETERS FROM USER ; LD B,4 ;GET PARAMETERS FROM USER CALL EXPR ; ; SET UP IOPB ; LD A,WRSCMD ;WRITE SECTOR COMMAND CNNNNNNNNNNNNNNNNNN >TNNNNNNNNNNNNNNNNNNNNN! ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR [@NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITaNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EX]JNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS NNNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNNIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (NNNNNNNNNNNNNNNNN ,^NNNNNNNNNNNNNNNNNNNNNNB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PA6HrNNNNNNNNNNNNNNNNNN HNNNNNNNNNNNNNNNNNNNNNNTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQU&NNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNEQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TANNNNNNNNNNNNNNNNNN  eNNNNNNNNNNNNNNNNNNNNNNAS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR INNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSbNNNNNNNNNNNNNNNNN !(NNNNNNNNNNNNNNNNNNNNNNROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. rNNNNNNNNNNNNNNNNNNN '*NNNNNNNNNNNNNNNNNNNNNNHL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,E BNNNNNNNNNNNNNNNNN -mNNNNNNNNNNNNNNNNNNNNNNRAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SxNNNNNNNNNNNNNNNNNN џNNNNNNNNNNNNNNNNNNNNNN 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;===================$NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNRGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER^NNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD INITIALIZA%NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1;RNNNNNNNNNNNNNNNNNN [ENNNNNNNNNNNNNNNNNNNNNNH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES ?NNNNNNNNNNNNNNNNNN "}NNNNNNNNNNNNNNNNNNNNNN ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO ɁNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;**************************NNNNNNNNNNNNNNNNNN .8NNNNNNNNNNNNNNNNNNNNNNET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;********************************************************************** NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN========= IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATIwuNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS KNNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNN!TION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IM9NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TElHNNNNNNNNNNNNNNNNN htNNNNNNNNNNNNNNNNNNNNN!TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD B&NNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNNMONITOR EXEC ;**************************************************************************** ; ; MEMSIZ SUBR CALCULATES THEzdNNNNNNNNNNNNNNNNN )%NNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONNNNNNNNNNNNNNNNNN / NNNNNNNNNNNNNNNNNNNNNN****** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINbrNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNON ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC NNNNNNNNNNNNNNNNNN  X6NNNNNNNNNNNNNNNNNNNNNN JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/OuHNNNNNNNNNNNNNNNNN xJNNNNNNNNNNNNNNNNNNNNNNAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!NS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CyNNNNNNNNNNNNNNNNNN ='NNNNNNNNNNNNNNNNNNNNNN,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),_NNNNNNNNNNNNNNNNNN $yNNNNNNNNNNNNNNNNNNNNNN TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WONNNNNNNNNNNNNNNNNN *vNNNNNNNNNNNNNNNNNNNNNNNITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;********************************JNNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITSMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNρm; ؅vD≰~MꍸU$_-˖h7Ԛq@ݞ{I梵R!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRNNNNNNNNNNNNNNNNNNN ( NNNNNNNNNNNNNNNNNNNNNN2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;---------------------------------------------- NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,gNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNN!---- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GENNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;--------------------lNNNNNNNNNNNNNNNNN %HNNNNNNNNNNNNNNNNNNNNNN------------------------ ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; RNNNNNNNNNNNNNNNNNN +kNNNNNNNNNNNNNNNNNNNNNN JR CMPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIlHNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;******************************************************************sNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNN------------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHY NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN- ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DrNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNN!A JP (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIf!NNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNN!T NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUEU'NNNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZrNNNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNNDIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS NNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ.NNNNNNNNNNNNNNNNN !`NNNNNNNNNNNNNNNNNNNNNNED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEE-NNNNNNNNNNNNNNNNNN '.NNNNNNNNNNNNNNNNNNNNNN& THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V C-NNNNNNNNNNNNNNNNN - NNNNNNNNNNNNNNNNNNNNNNS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIٰNNNNNNNNNNNNNNNNNN }sNNNNNNNNNNNNNNNNNNNNNNET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOGXNNNNNNNNNNNNNNNNN ^|NNNNNNNNNNNNNNNNNNNNNN ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax UNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNTHE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURNNNNNNNNNNNNNNNNNNN bNNNNNNNNNNNNNNNNNNNNNN ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;-------------------------------------"NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;**************************~BNNNNNNNNNNNNNNNNN "3NNNNNNNNNNNNNNNNNNNNNNS THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-----------------------NNNNNNNNNNNNNNNNN (>NNNNNNNNNNNNNNNNNNNNNN ; ;---------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCNNNNNNNNNNNNNNNNNN .^NNNNNNNNNNNNNNNNNNNNN!T IN IT'S ADDR. ; ; D[ ] ; ;-------------------------------------------------------------------------rNNNNNNNNNNNNNNNNN NBNNNNNNNNNNNNNNNNNNNNNNT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR rNNNNNNNNNNNNNNNNNN mMNNNNNNNNNNNNNNNNNNNNNN ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ;  NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;I;.NNNNNNNNNNNNNNNNNN +SNNNNNNNNNNNNNNNNNNNNNN--------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LDC.HNNNNNNNNNNNNNNNNNN ;mNNNNNNNNNNNNNNNNNNNNNN;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;------------------------`DNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT -NNNNNNNNNNNNNNNNNN ${NNNNNNNNNNNNNNNNNNNNNN THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;----------------------------------------------------8NNNNNNNNNNNNNNNNNN *XNNNNNNNNNNNNNNNNNNNNNNS2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB NNNNNNNNNNNNNNNNNNN 0"NNNNNNNNNNNNNNNNNNNNNNSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNˁi7ՅsB߉|K荵R![)ǖd2Ϛl; ؞vE⢱NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF BNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN---------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELTNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN! CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LDRNNNNNNNNNNNNNNNNNN ЧNNNNNNNNNNNNNNNNNNNNN!L,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GߌNNNNNNNNNNNNNNNNN ?lNNNNNNNNNNNNNNNNNNNNNN---------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------INNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAUBNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNN----------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXҟNNNNNNNNNNNNNNNNNN +\NNNNNNNNNNNNNNNNNNNNNNE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVE,!NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTAB{NNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNNECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ANNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BNNNNNNNNNNNNNNNNN I0NNNNNNNNNNNNNNNNNNNNN!O DO REG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND aNNNNNNNNNNNNNNNNN j?NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN TwNNNNNNNNNNNNNNNNN  aNNNNNNNNNNNNNNNNNNNNNNLT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;---------------------------------------------------------ƋNNNNNNNNNNNNNNNNNN &*NNNNNNNNNNNNNNNNNNNNNNISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' TrNNNNNNNNNNNNNNNNN , NNNNNNNNNNNNNNNNNNNNNNNESS. ; ; T ; ;---------------------------------------------------------------------------- MTEST: NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HINNNNNNNNNNNNNNNN  <NNNNNNNNNNNNNNNNNNNNNNCTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPSNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!C ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPECNNNNNNNNNNNNNNNNN zNNNNNNNNNNNNNNNNNNNNNN ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;---------BNNNNNNNNNNNNNNNNNN YNNNNNNNNNNNNNNNNNNNNNNHE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; rNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),AdNNNNNNNNNNNNNNNNNN /RNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PU^HNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDR> ; ;---------------------------------------------------------------------------- MOVE: CALL EXPR3 MOV1aNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURNrNNNNNNNNNNNNNNNNN ( NNNNNNNNNNNNNNNNNNNNNNPOP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL N$NNNNNNNNNNNNNNNNNN .nNNNNNNNNNNNNNNNNNNNNNN: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,ϪNNNNNNNNNNNNNNNNN yrNNNNNNNNNNNNNNNNNNNNNNLL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADNNNNNNNNNNNNNNNNNN  Z}NNNNNNNNNNNNNNNNNNNNNNG,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------------------9NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZNNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNNT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-----------NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT CORINNNNNNNNNNNNNNNNNN #2NNNNNNNNNNNNNNNNNNNNNN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCAVNNNNNNNNNNNNNNNNNN ):NNNNNNNNNNNNNNNNNNNNNN SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;--------NNNNNNNNNNNNNNNNNNN /_NNNNNNNNNNNNNNNNNNNNNN8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP NNNNNNNNNNNNNNNNNN ,!NNNNNNNNNNNNNNNNNNNNN!D B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;------------------------------------------------>"rNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP >iNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HHNNNNNNNNNNNNNNNNNN  ]NNNNNNNNNNNNNNNNNNNNNN--------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;----------------------xNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7:LNNNNNNNNNNNNNNNNNN $LNNNNNNNNNNNNNNNNNNNNNNTION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-----------------------------------------------:NNNNNNNNNNNNNNNNNN *oNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SE]!NNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNDE RET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INS'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁l: ؅vE≱O썺W&Òa/Ζk: ؚuDឯ~L颸U$nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNN!PECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; XNNNNNNNNNNNNNNNNNNNNNNOUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRnNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNN***************************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;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 ; ;d= HEX NUMBER NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN! LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BINNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN! AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP rNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!QUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;***************************************************#NNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNLF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;*************************************************************** EXPR3: INNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN***************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOuNNNNNNNNNNNNNNNNNN &kCNNNNNNNNNNNNNNNNNNNNNNY BIT IS SET TO FLAG THE ERR. ; ;*************************************************************** NIBBLE: SUB '0' RET C CP NNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;***\NNNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNN TO PLACE INTO REGISTER r ; ;---------------------------------------------------------------------------- XAA: INC HL ;SKIP NNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNNTS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAJrNNNNNNNNNNNNNNNNNN =NNNNNNNNNNNNNNNNNNNNN! EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ENNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNN************ CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A&rNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;**********************************************}NNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNN!R EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************************** gNNNNNNNNNNNNNNNNNN 'XrNNNNNNNNNNNNNNNNNNNNNN 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;*****************************NNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNN************************************************************************* ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS CNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNOVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80Hu NNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL %NNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNNLSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) kNNNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNN RET ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE[NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN****************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF NNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNHILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF C dNNNNNNNNNNNNNNNNN (HLNNNNNNNNNNNNNNNNNNNNN!*********************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; D)0NNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNNWHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AN{NNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNN ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA GNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD NNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNN! LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OU)NNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*************************************************************** DECHO: CuNNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLYmrNNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NUNNNNNNNNNNNNNNNNNN ){}NNNNNNNNNNNNNNNNNNNNNNELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURNNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;*********BNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNN;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,NNNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNN A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASdNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;***********************************B NNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNNALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP grNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN. ; ;**************************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETUNNNNNNNNNNNNNNNNNN $ !NNNNNNNNNNNNNNNNNNNNNNZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;*************************************************************** ; ; NIBBLE RNNNNNNNNNNNNNNNNNN *..NNNNNNNNNNNNNNNNNNNNNNTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;***********************NNNNNNNNNNNNNNNNNN 0–NNNNNNNNNNNNNNNNNNNNNN******************************************************************* REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF+'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6ӅqA߉|K荵R![)ǖd2Кm< ٞvDᢰ~MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL UNNNNNNNNNNNNNNNNNN iNNNNNNNNNNNNNNNNNNNNNNT POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC ZNNNNNNNNNNNNNNNNN  oNNNNNNNNNNNNNNNNNNNNNN A,B LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD ShNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD HL,IOMSG JR COMERR ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------NNNNNNNNNNNNNNNNN INNNNNNNNNNNNNNNNNNNNNNAPT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH 'NNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNBY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ;TNNNNNNNNNNNNNNNNN % NNNNNNNNNNNNNNNNNNNNNNCONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: PUSH HL CRLdNNNNNNNNNNNNNNNNNN +*/NNNNNNNNNNNNNNNNNNNNNN********************* DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR NNNNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNN RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DNNNNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNNINC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HLNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brGNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@NNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNN!**** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF JNNNNNNNNNNNNNNNNNN %X NNNNNNNNNNNNNNNNNNNNN!============ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFA NNNNNNNNNNNNNNNNNN +{NNNNNNNNNNNNNNNNNNNNNN INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIjBNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNNT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;-,NNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNN--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNN!eakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCINNNNNNNNNNNNNNNNNN & ^NNNNNNNNNNNNNNNNNNNNNNULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATGNNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNN!ST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCKNNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNN!---------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LISo,NNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H LdNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelNNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4NNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST ODNNNNNNNNNNNNNNNNNN '>oNNNNNNNNNNNNNNNNNNNNNNION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQM NNNNNNNNNNNNNNNNN -ѤNNNNNNNNNNNNNNNNNNNNNN ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY{NNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNNT DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SEBNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNN DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPL^NNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi`NNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNN ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START A$NNNNNNNNNNNNNNNNN (.QNNNNNNNNNNNNNNNNNNNNNNU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOCNNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNN LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; NNNNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNN!RIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '32zNNNNNNNNNNNNNNNNNN  }NNNNNNNNNNNNNNNNNNNNNNLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB '$BNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNN! TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMNNNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNNning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to udNNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNNNnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.X 3 JUN 86 rNNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNN!DDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; =NNNNNNNNNNNNNNNNN )`NNNNNNNNNNNNNNNNNNNNNN EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM*gNNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNN; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;----------------------------------------ޅNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C'6;NNNNNNNNNNNNNNNNNNN  sNNNNNNNNNNNNNNNNNNNNNNX',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************erNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNN!boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhNNNNNNNNNNNNNNNNN bNNNNNNNNNNNNNNNNNNNNNN GRH ; MODIFY TO WORK WITH M5INIT ; VERSN EQU '1x' ;************************************************************************[HNNNNNNNNNNNNNNNNNN $k ۞xF㢲ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ӫNNNNNNNNNNNNNNNNNNNNNN----------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSUNNNNNNNNNNNNNNNNNNN y NNNNNNNNNNNNNNNNNNNNN!MORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 ME(!NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNHL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;******************************woHNNNNNNNNNNNNNNNNN YqNNNNNNNNNNNNNNNNNNNNNN,BC POP BC ;UNPREDICTABLE DURING INIT RET ;*************************************************************************** ۞xG䢳PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN---- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL NNNNNNNNNNNNNNNNNNN N=NNNNNNNNNNNNNNNNNNNNNNSTART_ADDR> ; ;---------------------------------------------------------------------------- FILL: CAOCNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= Ne$dNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;------------------------------------------------------------------------ BNNNNNNNNNNNNNNNN nANNNNNNNNNNNNNNNNNNNNN!-------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HLHNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CA aNNNNNNNNNNNNNNNNNN %.NNNNNNNNNNNNNNNNNNNNNN NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATENNNNNNNNNNNNNNNNNN + NNNNNNNNNNNNNNNNNNNNNNN AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITHaBNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Zyg!NNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNNNLL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTONNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;*****:9NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN---- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE 'NNNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNN) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALNNNNNNNNNNNNNNNNN  LNNNNNNNNNNNNNNNNNNNNNNLL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LyNNNNNNNNNNNNNNNNNN &{NNNNNNNNNNNNNNNNNNNNNN LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO ~rNNNNNNNNNNNNNNNNN ,!NNNNNNNNNNNNNNNNNNNNNN BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- GY?NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;NNNNNNNNNNNNNNNNN  m2NNNNNNNNNNNNNNNNNNNNNNRE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;----------------?NNNNNNNNNNNNNNNNNN ǔNNNNNNNNNNNNNNNNNNNNN!************************************** ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;*******************NNNNNNNNNNNNNNNNN +,NNNNNNNNNNNNNNNNNNNNN!BELL DJNZ BYE1 RET ;---------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMʏNNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;------------------------------------ NNNNNNNNNNNNNNNNN !}NNNNNNNNNNNNNNNNNNNNN!D A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L59yNNNNNNNNNNNNNNNNNN 'HNNNNNNNNNNNNNNNNNNNNN!SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTO COMMAND $NNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNNOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,P<4NNNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNNADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;---------------------------------3NNNNNNNNNNNNNNNNN  8aNNNNNNNNNNNNNNNNNNNNNN------------ AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 C\'NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN************************ IOCHK: LD A,(IOBYTE) RET ;---------------------------------------------------------------------FNNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DE#'gNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSO{BNNNNNNNNNNNNNNNNN ".NNNNNNNNNNNNNNNNNNNNNN ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FgrNNNNNNNNNNNNNNNNN (XNNNNNNNNNNNNNNNNNNNNN!; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS 7 NNNNNNNNNNNNNNNNNN .CNNNNNNNNNNNNNNNNNNNNNNLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 yrNNNNNNNNNNNNNNNNN (_NNNNNNNNNNNNNNNNNNNNNN------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFvANNNNNNNNNNNNNNNNNN  PNNNNNNNNNNNNNNNNNNNNNNP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B ~NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & ANNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNNNTECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPmNNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CPwNNNNNNNNNNNNNNNNNN )kNNNNNNNNNNNNNNNNNNNNN!ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVERNNNNNNNNNNNNNNNNNN /rNNNNNNNNNNNNNNNNNNNNNN GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL=5NNNNNNNNNNNNNNNNNN } NNNNNNNNNNNNNNNNNNNNN!INED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F< [BNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL^NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNWILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE NNNNNNNNNNNNNNNNNN ]pNNNNNNNNNNNNNNNNNNNNNNIVE ADDRESS. ; ; V ; ;--------------------------------------------NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ]NNNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNNN 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR+cNNNNNNNNNNNNNNNNNN *>NNNNNNNNNNNNNNNNNNNNNN IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTIOsNNNNNNNNNNNNNNNNNN 0?NNNNNNNNNNNNNNNNNNNNNN EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR ENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNN΁l: ؅wF㉱~MꍷT#^,ʖg6Ӛp? ܞyG䢳PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHwNNNNNNNNNNNNNNNNNNNNNN INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),ANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------ INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE $GNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILO] NNNNNNNNNNNNNNNNNN-fNNNNNNNNNNNNNNNNNNNNNNRAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMInNNNNNNNNNNNNNNNNN­NNNNNNNNNNNNNNNNNNNNNNIF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MONNNNNNNNNNNNNNNNNNh NNNNNNNNNNNNNNNNNNNNNN JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD$BNNNNNNNNNNNNNNNNN%UNNNNNNNNNNNNNNNNNNNNNN END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH%;HNNNNNNNNNNNNNNNNNN+ZNNNNNNNNNNNNNNNNNNNNNN OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP C[NNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF  NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO <6HNNNNNNNNNNNNNNNNNNXINNNNNNNNNNNNNNNNNNNNNNXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY T{NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;---------------------------------------------------------XBNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNN A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;------------------------------------X#rNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL C)9NNNNNNNNNNNNNNNNN,8NNNNNNNNNNNNNNNNNNNNNNP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THENNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,2}NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNPORT COMMAND ; ; O ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTOɉINNNNNNNNNNNNNNNNNNkxNNNNNNNNNNNNNNNNNNNNNN<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------tNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNO ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CALL EXPR1 `BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS N9NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LNNNNNNNNNNNNNNNNNN'7NNNNNNNNNNNNNNNNNNNNN!ALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALNNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNNN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY ENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!4 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;----------------------------xNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! E, PORT # INTO C POP DE POP BC OUT (C),E RET ;----------------------------------------------------------------------PNNNNNNNNNNNNNNNNNNx5NNNNNNNNNNNNNNNNNNNNN!------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # PJNNNNNNNNNNNNNNNNNNғNNNNNNNNNNNNNNNNNNNNNN;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NE8NNNNNNNNNNNNNNNNN=XNNNNNNNNNNNNNNNNNNNNNNOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;------9NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,xYrNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RL8 NNNNNNNNNNNNNNNNNN.^NNNNNNNNNNNNNNNNNNNNNN JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RN9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------ ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR 2rNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!------ ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, S8eNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN!OP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR8NNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNN!---------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LDڴNNNNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNNNB,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 ; ;------------------V5NNNNNNNNNNNNNNNN)8NNNNNNNNNNNNNNNNNNNNNNCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR "ONNNNNNNNNNNNNNNNNN/mNNNNNNNNNNNNNNNNNNNNNNET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD o)BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----------------------------------------------------------ANNNNNNNNNNNNNNNNNN >+NNNNNNNNNNNNNNNNNNNNN!OURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------iNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNN!ND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;>eNNNNNNNNNNNNNNNNN[:NNNNNNNNNNNNNNNNNNNNN! (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX NNNNNNNNNNNNNNNNNN$dNNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF ATNNNNNNNNNNNNNNNNNN*kNNNNNNNNNNNNNNNNNNNNNNXF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR5NNNNNNNNNNNNNNNNNN0~NNNNNNNNNNNNNNNNNNNNNNB,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6ԅq@މzI捳P푼Z(ǖe3Кm< ٞvE⢱NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE.9ABNNNNNNNNNNNNNNNNN :*NNNNNNNNNNNNNNNNNNNNNN INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ƐNNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONNNNNNNNNNNNNNNNNN_;NNNNNNNNNNNNNNNNNNNNNNTHE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMM1BNNNNNNNNNNNNNNNNN%eNNNNNNNNNNNNNNNNNNNNNN TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT5dNNNNNNNNNNNNNNNNNN+jNNNNNNNNNNNNNNNNNNNNNN;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUjNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET JHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PnNNNNNNNNNNNNNNNNNNoyNNNNNNNNNNNNNNNNNNNNNN ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;******************************************5NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAGHNNNNNNNNNNNNNNNNN JNNNNNNNNNNNNNNNNNNNNNNANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;**********************************************************DNNNNNNNNNNNNNNNNNN&6NNNNNNNNNNNNNNNNNNNNNN 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) 'dNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!SH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MO9XNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;**************************************************************************** ; ; CBNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;**********************************NNNNNNNNNNNNNNNNNN\HNNNNNNNNNNNNNNNNNNNNNN********************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPAR1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!;*************************************************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ;uNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;************************************************************************`NNNNNNNNNNNNNNNNN!yNNNNNNNNNNNNNNNNNNNNNN****************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION BNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D }rNNNNNNNNNNNNNNNNN-rNNNNNNNNNNNNNNNNNN/ZNNNNNNNNNNNNNNNNNNNNNN ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETEANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!O ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;************************************;NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HILO ROUTINENNNNNNNNNNNNNNNNNN)gNNNNNNNNNNNNNNNNNNNNNNLING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RNNNNNNNNNNNNNNNNNNƬNNNNNNNNNNNNNNNNNNNNNN RET NC SUB 'A' - '9' - 1 CP 10 RET ;**************************************************************************** rNNNNNNNNNNNNNNNNNl NNNNNNNNNNNNNNNNNNNNNN************************ ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. bPINNNNNNNNNNNNNNNNNN$TNNNNNNNNNNNNNNNNNNNNNN ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWAREtHNNNNNNNNNNNNNNNNNN*[NNNNNNNNNNNNNNNNNNNNNNSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) 1NNNNNNNNNNNNNNNNNN0INNNNNNNNNNNNNNNNNNNNNNCTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERRORNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNN΁k9օsC|K荵R!\*Ȗf5Ӛp? ܞyG䢳Q NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CrNNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNN; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTNNNNNNNNNNNNNNNNN {NNNNNNNNNNNNNNNNNNNNNNREADS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: INNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN*********************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;****NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN****************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLEDNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************************************, NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; NNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-------------------------------------------------------NNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;**************************************************************************** QUERNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNCALL CI AND 7FH RTS: RET ;**************************************************************************** ; ; PRTWD ROUTI0rNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNN!*********************************************************** EXLF: CALL EXPR POP DE POP HL ;***************************8fNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE(NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*********************************************OnNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN****************** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CXNNNNNNNNNNNNNNNNN,NyNNNNNNNNNNNNNNNNNNNNNN ;************************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSTAT0 ;PRINGqNNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN--------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;------------------0BNNNNNNNNNNNNNNNN jNNNNNNNNNNNNNNNNNNNNNNY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET C/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; T dNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNN************************************ ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;****27NNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNN! OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT ^NNNNNNNNNNNNNNNNN!8%NNNNNNNNNNNNNNNNNNNNN!**************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNI3 ;CONSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPUT SELECTORMRNNNNNNNNNNNNNNNNN-}HNNNNNNNNNNNNNNNNNNNNNNTER 0 CP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;****************NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- RSTER: LD 6NNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNNNURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE I$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;**********************************************iNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN*********************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET NNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNA AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LBNNNNNNNNNNNNNNNNN"mvNNNNNNNNNNNNNNNNNNNNNN ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTSINNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*****************************************9INNNNNNNNNNNNNNNNNN.(NNNNNNNNNNNNNNNNNNNNNN**************************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4:GnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;----------------------nrNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,WNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN****************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LDcNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ;NNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;****************************************+NNNNNNNNNNNNNNNNNN#^GNNNNNNNNNNNNNNNNNNNNN!: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3HNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN******************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 JP Z,LO2.NNNNNNNNNNNNNNNNNN/*NNNNNNNNNNNNNNNNNNNNNN SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************************NNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNN!----------- COMERR: CALL PRTWD JP WSVEC ;**************************************************************************** ; NNNNNNNNNNNNNNNNNN HNNNNNNNNNNNNNNNNNNNNNNDE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONI ROUTINE aNNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNN A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;****************************************S[NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN! EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*********************************\NNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN**************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; CNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN! ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0|NNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; ; LIST DEVICEHNNNNNNNNNNNNNNNNNN0gNNNNNNNNNNNNNNNNNNNNNN******** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHA\NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃi7ՅsAމzI捳P푼Z(ǖd2Ϛl; ؞uCࢯ}LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; ; SERIAL NNNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNAR THEN WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NTS) ;IF NONNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNN*********************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;************************************** fmNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN******** ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1R'NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN********** SI0: EQU IOER SO0: EQU IOER ;************************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;********dNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!**** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;**************NNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DBfNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC NNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNNCHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;*********************NNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;***************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3: EQU IOERNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN ; LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),ANNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNN****************************** SI1: EQU IOER SO1: EQU IOER ;************************************** ; ; SERIAL CHANNEL 2-NNNNNNNNNNNNNNNN <$NNNNNNNNNNNNNNNNNNNNNN*************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;FNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEfsrNNNNNNNNNNNNNNNNN,yINNNNNNNNNNNNNNNNNNNNNN DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC $rNNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNN**************************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP 20H JP )NNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNNN*********** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NOT READY THANNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO0: CALLlNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN! RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1:NNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN (SC2) ; ;************************************** SI2: EQU IOER SO2: EQU IOER ;************************************** ; NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '3' ; CONS%NNNNNNNNNNNNNNNNN-JxNNNNNNNNNNNNNNNNNNNNNN DB -1 END |'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNM,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;**********SINNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNEN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1 j NNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNN! LSTAT0 JR Z,LO0 ; LD A,0BFH ;INSURE STROBE HIGH (LOGICAL 0) OUT (PRI2CNT),A LD A,C ;OUTPUT CHARACTER OUT (PRI1DOVmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET NNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG:NNNNNNNNNNNNNNNNN"ZFNNNNNNNNNNNNNNNNNNNNNN DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;--------------------------------- ; ; Z80 REGIS#NNNNNNNNNNNNNNNNNN.+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNN!**************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALL CSTS0 ;NNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNN; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR RET Z ,QNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: 0NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN ;************************************** ; ; LIST DEVICE 2 (LST2) ; ;************************************** LO2: EQU IO|INNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' qNNNNNNNNNNNNNNNNNN#iwNNNNNNNNNNNNNNNNNNNNNN DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIS1NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB+!NNNNNNNNNNNNNNNNNN/,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNIF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CH:NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***7NNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNNIN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST RET Z ; LD A,-1 RET ;******************************QNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNER LSTAT2: EQU IOER ;************************************** ; ; SERIAL CHANNEL 0 (SC0) ; ;****************************~BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;*************************************************4rNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNT DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB_uNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',>tNNNNNNNNNNNNNNNNNN0?WNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNN΁k9 ׅvF㉱N델U%’`.̖i7ԚqAޞ|J袷T#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN TITLE M5 INITIALIZATION LIST NOCOND ;*************************************************************************** ; ; M5 INNNNNNNNNNNNNNNNNNN[,NNNNNNNNNNNNNNNNNNNNNNSTART ADDRESS OF THIS PROM MONROM EQU 0800H ;START ADDRESS OF MONITOR CODE IN ROM OVROM EQU 1000H ;START ADDRESS OF MONITOR GNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;=========================================================================== ORG IOROM NTINIT DS 3 ;NAKED TERMINAL INIT NTsO NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;SET COUNT LD SP,HRAMDN - 2 ;FAKE RETURN ADDRESS IN ROM JP RAMTST ; DW HRAMDN HRAMDN: JR Z,HRAMOK ;IF HIGH RAM OK THEN GM`NNNNNNNNNNNNNNNNN{PNNNNNNNNNNNNNNNNNNNNNNX ;ELSE DO LOW BYTE LD A,L EXX JR FRE6 ; FRE10: LD C,'H' ;OUTPUT H SUFFIX LD SP,FRE11 - 2 JP NTOUT ; DW FRE11 /$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PORT EXX SUB A,10H ;CONVERT 41..43H TO '1'..'3' LD C,A CALL NTOUT LD HL,JADM2 CALL POUT ; ; COMMAND THE SELF TNNNNNNNNNNNNNNNNN%;NNNNNNNNNNNNNNNNNNNNNNASSED ; EXX LD HL,PM CALL POUT EXX JR NOJADE ; ; CONTROLLER FAILED ; JAD5: EXX ;OUTPUT FAILED LD HL,FM 2NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN ISHA1: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,ISHADN ; DEC HL ;IF COUNT NOT EXHAUSTED THEN REPEAT LD A,L OR A,H JR NZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNITIALIZATION CODE ; ;*************************************************************************** ; ; This module contains thTNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNOVERLAYS IOROM EQU 3000H ;START ADDRESS OF I/O DRIVER ROM LOTEST EQU 0A000H ;PLACE TO PUT LOW MEMORY TEST MONST EQU 0F800H NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOUT DS 3 ;NAKED TERMINAL OUTPUT NTINI DS 3 ;NAKED TERMINAL INPUT INIT NTIN DS 3 ;NAKED TERMINAL INPUT (KEYBOARD) CR EQU ԥrNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!O DO LOW RAM ; ; FATAL ERROR- HIGH RAM NO GOOD FOR STACK! PRINT IT OUT! ; FRE: EXX ;SAVE ADDRESS LD DE,RAMMSG ;PRINT MvNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN FRE11: JR $ ;EFFECTIVELY HALT ; ; HIGH RAM OK, SET STACK & CHECK LOW RAM ; HRAMOK: LD SP,9000H ;SHOULD BE OK CALL TSTLHHNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNEST ; EXX LD A,DDBGN ;RESET BOARD OUT (C),A ; LD HL,0 JAD2: IN A,(C) ;CHECK FOR DONE BIT DDSHLT,A JR Z,JAD4 ; BNNNNNNNNNNNNNNNNNN&nNNNNNNNNNNNNNNNNNNNNNNCALL POUT ; LD A,(IX + PBSTATO) ;OUTPUT STATUS CALL OUTBH EXX ; ; NEXT BOARD ; NOJADE: XOR A,A ;REMOVE FDC WINDOW NNNNNNNNNNNNNNNNN,0NNNNNNNNNNNNNNNNNNNNN!,ISHA1 ; ; ERROR, BOARD TIMED OUT ; LD HL,TMOM CALL POUT JR NOISHA ; ; CHECK FOR SELF TEST ERROR ; ISHADN: IN AQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNe Z-80 code to perform self test and ; initialization of the M5b system. It is expected to get control after ; reset and resid}NNNNNNNNNNNNNNNN x#NNNNNNNNNNNNNNNNNNNNNN ;START OF MONITOR RAM IMAGE ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE ISHA.DEF ;*INCLUDEkNNNNNNNNNNNNNNNNNN҅NNNNNNNNNNNNNNNNNNNNNN0DH LF EQU 0AH SUBTTL CODE ;--------------------------------------------------------------------------- ; ; BEGINNING ONNNNNNNNNNNNNNNNN>=NNNNNNNNNNNNNNNNNNNNNNESSAGE FRE3: LD A,(DE) OR A,A JR Z,FRE2 ; LD C,A INC DE LD SP,FRE1 - 2 JP NTOUT ; DW FRE1 FRE1: JR FRE3 ; FRNNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNOW JR NZ,FRE ; ; ALL RAM PASSED, GO ON TO SELF TESTS ; ;----------------------------------------------------------------ԠNNNNNNNNNNNNNNNNN!lNNNNNNNNNNNNNNNNNNNNNN DEC HL ;WAIT FOR A WHILE LD A,L OR A,H JR NZ,JAD2 ; ; CONTROLLER TIMEOUT! ; JAD3: EXX LD HL,TMOM CALL POUT dNNNNNNNNNNNNNNNNNN']NNNNNNNNNNNNNNNNNNNNNN OUT (C),A ; INC C ;NEXT PORT LD A,C CP A,44H JR C,JAD1 ; ; ;----------------------------------------------------- NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN,(HDATA) ;FETCH SELF TEST STATUS OR A,A JR NZ,ISHAER ; ; ISHA OK ; LD HL,PM CALL POUT JR NOISHA ; ; ISHA ERROxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!e at page 0. After self test it then moves ZMON2 to high ; memory and transfers control to the ZMON2 cold start routines. ; ;cNNNNNNNNNNNNNNNNN -pNNNNNNNNNNNNNNNNNNNNN! JDDCONT.DEF ;*INCLUDE PROMIII.DEF ;*INCLUDE PRI.DEF ;*INCLUDE COMIOPB.DEF LIST OFF *INCLUDE MONBOARD.DEF *INCLUDE NAKEDTINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNF SELF TEST ; ;--------------------------------------------------------------------------- ORG PROMST ; ; FIRST DISABLE "NNNNNNNNNNNNNNNNNNknNNNNNNNNNNNNNNNNNNNNNNE2: LD E,4 ;DIGIT COUNT ; EXX ;RESTORE BAD ADDRESS FOR OUTPUT LD A,H EXX ; FRE6: RLCA RLCA RLCA RLCA LD B,A _NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN----------- ; ; SELF TESTS: ; ;--------------------------------------------------------------------------- ; ; JADE FLOP3 NNNNNNNNNNNNNNNNN"?NNNNNNNNNNNNNNNNNNNNNNEXX JR NOJADE ; ; CONTROLLER DONE, GET RESULTS ; JAD4: LD A,DDMB0 ;FETCH RESULTS OUT (C),A ; IN A,(C) ;COMPUTE 7NNNNNNNNNNNNNNNNN(MNNNNNNNNNNNNNNNNNNNNNN---------------------- ; ; TEST INTELLIGENT SASI HOST ADAPTER ; ;---------------------------------------------------------NNNNNNNNNNNNNNNNNN.RNNNNNNNNNNNNNNNNNNNNNNR ; ISHAER: PUSH AF ;SAVE ERROR CODE LD HL,FM CALL POUT POP AF CALL OUTBH ; NOISHA: ; ; ;-----------------------i)NNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNN*************************************************************************** ; ; Revisions: ; ; 1.0 Release grh ; VERS EQ-NNNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNN.DEF *INCLUDE CLOCK.DEF *INCLUDE ISHA.DEF *INCLUDE JDDCONT.DEF *INCLUDE PROMIII.DEF *INCLUDE PRI.DEF *INCLUDE COMIOPB.DEF NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMONITOR BOARD RAM IN CASE ITS INSTALLED ; LD A,8 OUT (0FCH),A ; ; REMOVE THE JADE CONTROLLERS FROM MEMORY 1ST ; LD CsNNNNNNNNNNNNNNNNNNNX_NNNNNNNNNNNNNNNNNNNNNN AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A LD SP,FRE5 - 2 JP NTOUT ; DW FRE5 FRE5: LD A,B ;RESTORE BYTE FORNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPY CONTROLLERS ; LD C,41H ;START WITH 1ST BOARD JAD1: IN A,(C) ;SEE IF BOARD PRESENT INC A ;IF 0FFH THEN ABSENT JR Z,a$NNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNBOARD ADDRESS AND A,DDSASW RLCA OR A,HIGH DDBASE LD H,0A0H ;STORE DATA LD L,C LD (HL),A ; LD H,A LD L,0 LD D NNNNNNNNNNNNNNNNN)~NNNNNNNNNNNNNNNNNNNNNN------------------ IN A,(HSTATUS) ;CHECK FOR PRESENCE INC A JR Z,NOISHA ; ; BOARD FOUND, TEST IT ; LD HL,ISHAM ;REP ?NNNNNNNNNNNNNNNNNN/cNNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------- ; ; CROMEMCO 'PRI' PRINTER INTERFACE SELF TEST ; ;--------------------- BNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNNU '10' ; ;*************************************************************************** SUBTTL DECLARATIONS PROMST EQU 0 ;NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LIST ON ;=========================================================================== ; ; I/O DRIVER PROM ENTRY POINTS ; 4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,41H X1: XOR A,A OUT (C),A INC C LD A,C CP 44H JR C,X1 ; ; TEST HIGH RAM ; LD HL,8000H ;SET PTR LD BC,8000H DNNNNNNNNNNNNNNNNNNHaNNNNNNNNNNNNNNNNNNNNNN NEXT DIGIT DEC E ;IF COUNT EXHAUSTED THEN DONE JR Z,FRE10 ; BIT 0,E ;IF ODD THEN GO DO 2ND NIBBLE JR NZ,FRE6 ; EX`9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOJADE ; ; CONTROLLER PRESENT, ANNOUNCE IT ; EXX LD HL,JADM ;OUTPUT BOARD PRESENCE CALL POUT EXX LD A,C ;OUTPUTNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNE,DDCBO ADD HL,DE PUSH HL POP IX ; LD A,(IX + PBSTATO) ;GET SELF TEST STATUS OR A,A JR NZ,JAD5 ; ; CONTROLLER PDNNNNNNNNNNNNNNNNNN*+NNNNNNNNNNNNNNNNNNNNNNORT FIND CALL POUT ; LD A,1 SHL HRESET ;START THE TEST OUT (HCMD),A XOR A,A OUT (HCMD),A ; LD HL,0 ;WAIT FOR DONENNNNNNNNNNNNNNNNNN0.NNNNNNNNNNNNNNNNNNNNN!------------------------------------------------------ IN A,(PRI1ST) ;TEST FOR PRESENCE INC A JR Z,NOPRI ; ; ANNOUNCE {HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNˁi7օsB|K荶S"𑿒]+ɖf5Ӛp? ܞxG䢳PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNƺNNNNNNNNNNNNNNNNNNNNNNTHE BOARD'S PRESENCE ; LD HL,PRIM CALL POUT LD HL,PTM CALL POUT ; NOPRI: ; ; ;------------------------------------FQNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNN! 1 TEST ; LD E,1 LD B,8 PROM2: CALL REGCMP PUSH AF LD A,B ;PASS COUNT + 10H BACK AS ERROR ADD A,10H LD D,A POP nNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN---------------------- IN A,(CLKDAT) ;CHECK FOR PRESENCE INC A JR Z,NOCLK ; ; CLOCK PRESENT, TEST IT ; LD C,CLKSECLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLD BC,2048 MONTST: LD A,(DE) CP A,(HL) JR NZ,MONERR ; INC HL INC DE DEC BC LD A,C OR A,B JR NZ,MONTST ; ; J0NNNNNNNNNNNNNNNNNL`NNNNNNNNNNNNNNNNNNNNNNAM LD DE,LOTEST LD BC,TLSIZE LDIR JP LOTEST ; ; NOW EXECUTING IN HIGH MEMORY ; TSTLO1: XOR A,A ;TURN OFF 32K BYTENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! COUNT NOT EXHAUSTED THEN REPEAT LD A,C OR A,B JR NZ,RAMTST ; RET ;ELSE RETURN ; TLSIZE EQU $ - TSTLO1 ;******"NNNNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNN OUTB ;*************************************************************************** ; ; OUTPUT 'H' SUBR ; ;*************qNNNNNNNNNNNNNNNNNN+/NNNNNNNNNNNNNNNNNNNNNN ; ;*************************************************************************** OUTSPC: LD C,' ' JP NTOUT ;++++++++++++;xNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN--------------------------------------- ; ; PROM PROGRAMMER SELF TEST ; ;---------------------------------------------------.'NNNNNNNNNNNNNNNNNN|"NNNNNNNNNNNNNNNNNNNNNNAF LD A,D JR NZ,PROME ; SLA E ;WALK BIT LEFT DJNZ PROM2 ; ; TEST A/D EOC ; CALL GETAD ;FETCH A/D DATA LD L,AڱNNNNNNNNNNNNNNNNNNNքNNNNNNNNNNNNNNNNNNNNNN ;WAIT FOR SECONDS TO CHANGE CALL GETD AND A,CLKDMSK LD B,A LD HL,0 ;SET ALARM CLK1: CALL GETD AND A,CLKDMSK CP A,QNNNNNNNNNNNNNNNNN: 7FH = LAU{dNNNNNNNNNNNNNNNNNN&YNNNNNNNNNNNNNNNNNNNNNN************************************************************** OUTH: LD C,'H' JP NTOUT ;********************************NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET CLOCK DATA FUNCTION ; ENTRY- C= CLOCK REGISTER # ; E)0dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------------ IN A,(PRMST) ;CHECK IF BOARD PRESENT INC A JR Z,NOPROM ; ; BOARD PRESENT, TEST IT! ; LD HL+NNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNN LD A,3 ;PASS BACK ERROR 3 JR C,PROME ; ; TEST A/D DATA ; LD A,L OR A,A ;IF 0 OR FFH THEN ERROR LD A,4 JR Z,P]@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB JR NZ,CLK2 ; DEC HL LD A,L OR A,H JR NZ,CLK1 ; ; TIMEOUT - FAILURE ; LD HL,FM CALL POUT JR NOCLK ; ; uINNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN HL ; LD HL,MONERM ;OUTPUT ERROR CALL POUT ; POP HL ;OUTPUT ADDRESS CALL OUTW CALL OUTSPC ; POP DE ;OUTPUT BITS$NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NON DESTRUCTIVE RAM TEST FUNCTION PNNNNNNNNNNNNNNNNN!\NNNNNNNNNNNNNNNNNNNNN!ST CHAR) ; ;*************************************************************************** POUT: LD C,(HL) PUSH HL RES 7,C 9NNNNNNNNNNNNNNNNNN'jNNNNNNNNNNNNNNNNNNNNNN******************************************* ; ; OUTPUT HEX BYTE SUBR ; ENTRY- A= BYTE ; ;**********************************K,dNNNNNNNNNNNNNNNNN-1NNNNNNNNNNNNNNNNNNNNNNXIT - A= REGISTER DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETD: LD A,C ;SET UP R$NNNNNNNNNNNNNNNNNN9ONNNNNNNNNNNNNNNNNNNNNN,PROMM CALL POUT ; LD A,1 SHL PPG ;OUTPUT PROGRAM GATE BIT TO READ DATA REGISTER OUT (PRMCMD),A LD C,PDATA ;SET UP DAT{INNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNNROME ; INC L LD A,5 JR Z,PROME ; ; SELF TEST PASSED ; LD HL,PM CALL POUT JR NOPROM ; ; SELF TEST FAILED ;gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PASS ; CLK2: LD HL,PM CALL POUT ; NOCLK: ; ; ;------------------------------------------------------------------------NNNNNNNNNNNNNNNNNN\^NNNNNNNNNNNNNNNNNNNNN! IN ERROR POP HL LD A,(DE) XOR A,(HL) CALL OUTBH ; JR $ ;EFFECTIVELY HALT SUBTTL FUNCTIONS & SUBROUTINES ;+++++vNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ; ENTRY- HL= RAM PTR ; BC= COUNT ; EXIT - ZF= PASS, NZ= FAIL (HL= BAD LOCATION ADDRESS) ; ;+++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN CALL NTOUT POP HL BIT 7,(HL) ;IF CHAR >= 80H THEN DONE RET NZ ; INC HL JR POUT ;******************************NNNNNNNNNNNNNNNNN(zNNNNNNNNNNNNNNNNNNNNNN***************************************** OUTBH: CALL OUTB ;OUTPUT WITH 'H' APPENDED JR OUTH ; ; OUTB: CALL PRDIG PRDIG:NNNNNNNNNNNNNNNNNN.bNNNNNNNNNNNNNNNNNNNNNNEAD SET CLKRD,A OUT (CLKCMD),A ; ; DELAY A WHILE ; EX (SP),HL EX (SP),HL ; ; RETURN DATA ; IN A,(CLKDAT) RtNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNA PORT # ; ; TEST DATA REGISTER FOR ALL 0S ; LD E,0 CALL REGCMP LD A,1 ;PASS ERROR # JR NZ,PROME ; ; TEST DATAfYNNNNNNNNNNNNNNNNNN )qNNNNNNNNNNNNNNNNNNNNNN PROME: PUSH AF ;SAVE ERROR CODE LD HL,FM CALL POUT POP AF CALL OUTBH ; NOPROM: ; ; ;----------------------------3 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN--- ; ; NOW BOOT MONITOR CODE ; ;--------------------------------------------------------------------------- ; ; BLOCK MiNNNNNNNNNNNNNNNNNNooNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST LOW RAM FUNCTION ; EXIT - ZF= PASS, NZ= FAIL 2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++ RAMTST: LD A,(HL) ;FETCH BYTE CPL ;INVERT IT LD (HL),A ;STORE IT CP (HL)BNNNNNNNNNNNNNNNNNN#>NNNNNNNNNNNNNNNNNNNNNN********************************************* ; ; OUTPUT HEX WORD SUBR ; ENTRY- HL= WORD ; ;*******************************6BNNNNNNNNNNNNNNNN)INNNNNNNNNNNNNNNNNNNNN! RLCA RLCA RLCA RLCA PUSH AF PUSH HL AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A CALL NTOUT POP HL PO 9NNNNNNNNNNNNNNNNNN/SNNNNNNNNNNNNNNNNNNNNNNET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMPARE PORT DATA READ-BACK FUNCTION 6NNNNNNNNNNNNNNNNNN_-NNNNNNNNNNNNNNNNNNNNNN REGISTER FOR ALL 1S ; LD E,-1 ;CHECK OPPOSIT CALL REGCMP LD A,2 JR NZ,PROME ; ; TEST DATA REGISTER WITH A WALKING NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!----------------------------------------------- ; ; CLOCK SELF TEST ; ;-----------------------------------------------------.{NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!OVE MONITOR TO HIGH RAM ; LD HL,MONROM LD DE,MONST LD BC,2048 LDIR ; ; TEST LOAD ; LD HL,MONROM LD DE,MONST sNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TSTLOW: LD HL,TSTLO1 ;MOVE THIS CODE TO HIGH R NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;TEST IT CPL ;RESTORE ORIGINAL DATA LD (HL),A RET NZ ;IF BAD THEN RETURN NZ ; INC HL ;NEXT LOCATION DEC BC ;IFyNNNNNNNNNNNNNNNNNN$?NNNNNNNNNNNNNNNNNNNNN!******************************************** OUTW: LD A,H ;START WITH HIGH BYTE PUSH HL CALL OUTB POP HL LD A,L CALLU"$NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNP AF RET ;*************************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR h$NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN ; ENTRY- C= PORT # ; E= PORT DATA IMAGE ; EXIT - A= DATA READ BACK ; ZF= PASS, NZ= FAIL ; ;+++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁j8ՅsB߉|K荵R![)Ŗc1Ϛl; ؞vE⢱NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++ REGCMP: OUT (C),E IN A,(C) CP A,E RET ;++++++++++++++++++++++++++++++YNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN DM CR,LF,'MONITOR LOAD ERROR AT ' JADM: DM CR,LF,'JADE FDC AT 4' JADM2: DM 'H =' ISHAM: DM CR,LF,'ISHA =' PRIM: DM CR,LF,'P9NNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN '10' ; ;*************************************************************************** SUBTTL DECLARATIONS PROMST EQU 3000HHNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNPUT TO KNOWN STATE ; ;--------------------------------------------------------------------------- JP NTOI ; ; ;----------1NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN-------------------- JP NTIN ; ; ;--------------------------------------------------------------------------- ; ; CONSOLEkNNNNNNNNNNNNNNNNN%MNNNNNNNNNNNNNNNNNNNNNN------------------------------------------- ; ; BIG Z USART INIT (SAME AS OUTPUT INIT) ; ;----------------------------------r[NNNNNNNNNNNNNNNNNN+nNNNNNNNNNNNNNNNNNNNNNN---------------- ; ; INIT VIDEO TO KNOWN STATE ; ;--------------------------------------------------------------------------;NNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++ ; ; GET A/D DATA FUNCTION ; EXIT - A= DATA ; CF= NO EOC ERROR ; B= ? ; ;+NNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNRI =' PROMM: DM CR,LF,'PROM =' CLKM: DM CR,LF,'CLOCK =' PM: DM ' PASS' FM: DM ' FAILED ' PTM: DM ' PRESENT' TMOM: DM ' TI~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNN ;START OF THIS CODE MODULE ;=========================================================================== ; ; INCLUSION}(9NNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------- ; ; CONSOLE OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;---NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; ;--------------------------------------------------------------NNNNNNNNNNNNNNNNNN&ONNNNNNNNNNNNNNNNNNNNNN----------------------------------------- JP BZOI ; ; ;--------------------------------------------------------------------uNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN- NTOI: LD C,1BH ;OUTPUT CLEAR SCREEN CALL NTOUT LD C,'E' ; ; FALL INTO NTOUT ; ;-----------------------------------k4dNNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETAD: LD A,[1 SHL PSCV] + [1 SHL PVO] ;ISSUE START h9NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNMED OUT' END ϐHNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNS ; ;=========================================================================== ;*INCLUDE NAKEDT.DEF ;*INCLUDE BIGZ.DEF L3NNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNN!------------------------------------------------------------------------ JP NTOUT ; ; ;------------------------------------:pNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN------------- JP NTIST ; ; ;--------------------------------------------------------------------------- ; ; INIT BIG Z USeDNNNNNNNNNNNNNNNNNN'+~NNNNNNNNNNNNNNNNNNNNNN------- ; ; BIG Z USART INPUT FUNCTION ; EXIT - A= CHARACTER ; ;-----------------------------------------------------------+NNNNNNNNNNNNNNNNN-ĵNNNNNNNNNNNNNNNNNNNNN!---------------------------------------- ; ; VIDEO OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;------------------------------NNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNCONVERT PULSE OUT (PRMCMD),A RES PSCV,A OUT (PRMCMD),A ; ; WAIT A WHILE FOR EOC ; LD B,0 EOCLP: IN A,(PRMST) ANDNNNNNNNNNNNNNNNNN [NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIST OFF *INCLUDE NAKEDT.DEF *INCLUDE BIGZ.DEF LIST ON SUBTTL ENTRY VECTORS ORG PROMST ; ; NOTE: THE FIRST 5 FUNC*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN--------------------------------------- ; ; CONSOLE INPUT INIT ; ;----------------------------------------------------------NNNNNNNNNNNNNNNNNNN"ԋNNNNNNNNNNNNNNNNNNNNN!ART TO KNOWN STATE ; ;--------------------------------------------------------------------------- JP BZOI ; ; ;----------%NNNNNNNNNNNNNNNNN(;@NNNNNNNNNNNNNNNNNNNNNN---------------- JP NTIN ; ; ;--------------------------------------------------------------------------- ; ; BIG Z USARTNNNNNNNNNNNNNNNNNNNNNNTEST AND INITIALIZATION. ; ;--------------------------------------------------------------------------- ; ; INIT CONSOLE OUTHNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNN--------------- ; ; CONSOLE INPUT FUNCTION ; EXIT - A= CHARACTER ; ;-------------------------------------------------------BNNNNNNNNNNNNNNNNNN$~-NNNNNNNNNNNNNNNNNNNNN!;--------------------------------------------------------------------------- JP BZOUT ; ; ;--------------------------------?NNNNNNNNNNNNNNNNNN*]"NNNNNNNNNNNNNNNNNNNNN!------------- JP NTIST SUBTTL NAKED TERMINAL I/O FUNCTIONS ;-----------------------------------------------------------=NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!DUMMY RETURN (NULL PROCEDURE) ; ;--------------------------------------------------------------------------- RETURN: RET NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6҅p@݉yG䍲O둺W%Ė`/̚i8Ԟq@ݢzHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;--------------------------------------------------------------------------- ; ; KEYBOARD INPUT FUNCTION ; EXIT - A= CHARACT>BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN--------------------------------------- ; ; INIT OUTPUT TO KNOWN STATE ; ;--------------------------------------------------?%NNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNNCHAR ; LD A,C OUT (BZUDAT),A RET ;--------------------------------------------------------------------------- ; ; )NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%z,NNNNNNNNNNNNNNNNNNNNNNis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelNNNNNNNNNNNNNNNNNN+Y#NNNNNNNNNNNNNNNNNNNNNNt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4NNNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNNER ; ;--------------------------------------------------------------------------- NTIN: CALL NTIST ;WAIT FOR CHARACTER READYNbNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------------------------- BZOI: XOR A,A ;GET 8251'S ATTENTION 1ST LD B,5 BZOI1: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNKEYBOARD INPUT FUNCTION ; EXIT - A= CHARACTER ; ;--------------------------------------------------------------------------- aNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&/NNNNNNNNNNNNNNNNNNNNN!ease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,INNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!ot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi`dNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN JR Z,NTIN ; ; FETCH CHARACTER ; IN A,(NTD) RET ;---------------------------------------------------------------yBNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNNN EX (SP),HL DJNZ BZOI1 ; ; NOW PROGRAM THE CHIP ; LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A ; LD A,BZUCM ;OUNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN BZIN: CALL BZINST ;WAIT FOR CHAR READY JR Z,BZIN ; ; RETURN CHARACTER ; IN A,(BZUDAT) RET ;-------------------dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN! TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNNning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to uNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8[6NNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN------------ ; ; KEYBOARD STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; ;-----------------------------------------VmNNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNNNTPUT COMMAND BYTE OUT (BZUCMD),A ; ; FLUSH GARBAGE ; IN A,(BZUDAT) RET ;----------------------------------------ځNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------- ; ; KEYBOARD STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; dNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************erNNNNNNNNNNNNNNNNN( pNNNNNNNNNNNNNNNNNNNNNNboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; VERSN EQU '19' ;**************************************QNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN---------------------------------- NTIST: ; ; IF STATUS == NOT READY THEN RETURN 0 ; IN A,(NTS) ;FETCH STATUS AND A,1<NNNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNN----------------------------------- ; ; CHARACTER OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;-------------------------------RyNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN ;--------------------------------------------------------------------------- BZINST: IN A,(BZUST) AND A,BZURXR RET Z ; urNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN#ЊNNNNNNNNNNNNNNNNNNNNNN****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brGNNNNNNNNNNNNNNNNN)?ANNNNNNNNNNNNNNNNNNNNNNe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@NNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITI (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,yNNNNNNNNNNNNNNNNN!-4NNNNNNNNNNNNNNNNNNNNN!----------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LhNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S dNNNNNNNNNNNNNNNNN-hYNNNNNNNNNNNNNNNNNNNNNN THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTED"NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN! ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: Cߒ NNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN EANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WARM START CODE ; ;--------------g NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNA USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUENNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNN3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H`NNNNNNNNNNNNNNNNN"xgNNNNNNNNNNNNNNNNNNNNN!OCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURN?NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNSAME RELATIVE ADDRESS. ; ; V ; ;----------------------------------NNNNNNNNNNNNNNNNNN.= NNNNNNNNNNNNNNNNNNNNNNS PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ <'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM zrNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LISjUrNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN-------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEJNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ; F ; ;----------------------------------------------------------------------------rNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNN ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ErNNNNNNNNNNNNNNNNNN#KVNNNNNNNNNNNNNNNNNNNNN!ED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;--------------------------------------------------------------SNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN------------------------------------------ COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR NNNNNNNNNNNNNNNNNN/;NNNNNNNNNNNNNNNNNNNNNNEND_ADDR>] ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITSNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN= PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PU9NNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNT) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; jINNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNNC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPINNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP wdNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET0INNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN-------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 eNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD'NNNNNNNNNNNNNNNNNN0vNNNNNNNNNNNNNNNNNNNNNN DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH H1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁k9օtD≰~MꍷT#]+ɖe4њo> ۞xG䢳Q NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNjVNNNNNNNNNNNNNNNNNNNNNNL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMN$BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! BLK ;DO SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTOS9NNNNNNNNNNNNNNNNN /;NNNNNNNNNNNNNNNNNNNNNN------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DEo`NNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN!ALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDRDHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!T DATA TO PORT COMMAND ; ; O ; ;-------------------------------------- OUPT: CALL EXPR ;GETNNNNNNNNNNNNNNNNNNJ*NNNNNNNNNNNNNNNNNNNNNNOM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;--------------ZIrNNNNNNNNNNNNNNNNN%tNNNNNNNNNNNNNNNNNNNNNNORTUNITY TO ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CANNNNNNNNNNNNNNNNNNN+{NNNNNNNNNNNNNNNNNNNNNN----------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIS8NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS A%NNNNNNNNNNNNNNNNNNzhNNNNNNNNNNNNNNNNNNNNNN LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR ~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;------------------9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;------------------------------------------------------------F!NNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNN---------------------------------- BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER NNNNNNNNNNNNNNNNNN&'NNNNNNNNNNNNNNNNNNNNNNLL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHSFBNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNT. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ?sNNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR CNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!S WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION A fNNNNNNNNNNNNNNNNNNIYNNNNNNNNNNNNNNNNNNNNN! JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE (NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN---------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYNNNNNNNNNNNNNNNNN!lNNNNNNNNNNNNNNNNNNNNNNBOOT # POP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEoNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN!K ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BA,NNNNNNNNNNNNNNNNN-)NNNNNNNNNNNNNNNNNNNNNN; ;---------------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AN|mNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;STARrNNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNN!B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE)$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;------------------------------------------------üBNNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;-----------!NNNNNNNNNNNNNNNNN"9NNNNNNNNNNNNNNNNNNNNNNMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRHNNNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNNNCK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE ( NNNNNNNNNNNNNNNNNN.|NNNNNNNNNNNNNNNNNNNNN! CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A ChrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FHNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNT EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC jWNNNNNNNNNNNNNNNNNNi%NNNNNNNNNNNNNNNNNNNNNN BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP 66NNNNNNNNNNNNNNNNNNÃNNNNNNNNNNNNNNNNNNNNNN---------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) NNNNNNNNNNNNNNNNN,HNNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A rANNNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINNv!NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN! LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L WNNNNNNNNNNNNNNNNNNNN/ONNNNNNNNNNNNNNNNNNNNNNALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL9NNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN!VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------LBNNNNNNNNNNNNNNNNNN ;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 ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;--------r,NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TfrNNNNNNNNNNNNNNNNNN~iNNNNNNNNNNNNNNNNNNNNN!LLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIB NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLE) ; EXIT - A= C= ASCII NUMBER ; ;*************************************************************** CONV: AND 0FH ADD A,90H,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE PARAMS. ; ;*************************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POPrNNNNNNNNNNNNNNNNN![NNNNNNNNNNNNNNNNNNNNNNOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS rrNNNNNNNNNNNNNNNNNN'&NNNNNNNNNNNNNNNNNNNNNN*********************************************************** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0'ENNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNCP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;******************************************SNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HSNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,AHNNNNNNNNNNNNNNNNNNNm$NNNNNNNNNNNNNNNNNNNNNNUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN8NNNNNNNNNNNNNNNNNNǂNNNNNNNNNNNNNNNNNNNNNN ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;**************************1HNNNNNNNNNNNNNNNNNN(INNNNNNNNNNNNNNNNNNNNNN BC POP DE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HIN!NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!TO THE CALLING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR lvrNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;********************************************************************NNNNNNNNNNNNNNNNNN.KNNNNNNNNNNNNNNNNNNNNNN********************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAdNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!CTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEMNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNN! EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************* ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOJNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNLO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET OUNNNNNNNNNNNNNNNNNN#=NNNNNNNNNNNNNNNNNNNNNN RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THwNNNNNNNNNNNNNNNNNN))NNNNNNNNNNNNNNNNNNNNNN******** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NrNNNNNNNNNNNNNNNNNN/xNNNNNNNNNNNNNNNNNNNNNNEXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTEVNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL .9NNNNNNNNNNNNNNNNNN +:NNNNNNNNNNNNNNNNNNNNNNN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OFJHNNNNNNNNNNNNNNNNN FNNNNNNNNNNNNNNNNNNNNNN POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PVINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LE DEVICE. ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONyNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNN RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;********************************CINNNNNNNNNNNNNNNNNN$uNNNNNNNNNNNNNNNNNNNNNNEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT NNNNNNNNNNNNNNNNNN*zNNNNNNNNNNNNNNNNNNNNNNON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE yNNNNNNNNNNNNNNNNNN0kNNNNNNNNNNNNNNNNNNNNNNRS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;************************************************HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNN΁k9օtCቯ}L鍶S"𑿒\*Ȗf4њo? ܞzI墵S!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;{NNNNNNNNNNNNNNNNNNNNN!**************************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK %BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 2NNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNTURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AdNNNNNNNNNNNNNNNNNN^jNNNNNNNNNNNNNNNNNNNNN!------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;--------NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!**** QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HhNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE ST rNNNNNNNNNNNNNNNNN%YNNNNNNNNNNNNNNNNNNNNNN********************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE.qNNNNNNNNNNNNNNNNNN+VNNNNNNNNNNNNNNNNNNNNNNSH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1NNNNNNNNNNNNNNNNNNNn(NNNNNNNNNNNNNNNNNNNNNNLOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORKTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN56 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT KINNNNNNNNNNNNNNNNNN+ENNNNNNNNNNNNNNNNNNNNNNF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 >NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!----------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!L) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS RNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;************************************ırNNNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNN ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL NNNNNNNNNNNNNNNNN,KNNNNNNNNNNNNNNNNNNNNNN ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADNNNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNN AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION $BNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNBP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ӆNNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNJP 0 ; ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;------------NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRANNNNNNNNNNNNNNNNN!=NNNNNNNNNNNNNNNNNNNNNN**************************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CA9NNNNNNNNNNNNNNNNNN';NNNNNNNNNNNNNNNNNNNNN! RET ;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE NNNNNNNNNNNNNNNNN-xNNNNNNNNNNNNNNNNNNNNNNRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;******************************NNNNNNNNNNNNNNNNNNĎNNNNNNNNNNNNNNNNNNNNNN LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE I$NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LNNNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNNNS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN--------------------- COMERR: CALL PRTWD JP WSVEC ;***********************************************************************gNNNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONNNNNNNNNNNNNNNNNNN"hNNNNNNNNNNNNNNNNNNNNN!LL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;******************************dNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNCONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;***********************9NNNNNNNNNNNNNNNNNN.-NNNNNNNNNNNNNNNNNNNNN!************************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: FNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUNDrNNNNNNNNNNNNNNNNNN ԰NNNNNNNNNNNNNNNNNNNNNND A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN***** ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAZNNNNNNNNNNNNNNNNN}eNNNNNNNNNNNNNNNNNNNNN!I ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************NNNNNNNNNNNNNNNNNN#[NNNNNNNNNNNNNNNNNNNNNN********************************* ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF.9NNNNNNNNNNNNNNNNN)4NNNNNNNNNNNNNNNNNNNNNN**************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRC=xNNNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNCON3 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0zPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE U;BNNNNNNNNNNNNNNNNNN M'NNNNNNNNNNNNNNNNNNNNNN EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RENNNNNNNNNNNNNNNNm[NNNNNNNNNNNNNNNNNNNNNN/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;---------------------------------------------:bHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!METERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;************************************************************************HNNNNNNNNNNNNNNNNNN(6NNNNNNNNNNNNNNNNNNNNN!** CONI: CALL CI AND 7FH RTS: RET ;**************************************************************************** ; ; P>NNNNNNNNNNNNNNNNNN$hNNNNNNNNNNNNNNNNNNNNN! ; ;*************************************************************** EXLF: CALL EXPR POP DE POP HL ;*****************2BNNNNNNNNNNNNNNNNN*gNNNNNNNNNNNNNNNNNNNNN!A RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DAnNNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN ;CONSOLE 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;***********************************RNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6ԅrAމ{J獴Q![)ǖe4њn> ۞yG䢴R NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN KNNNNNNNNNNNNNNNNNNNNNN************************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON}NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE 2 JP CI3 ;CONSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPU8 NNNNNNNNNNNNNNNNN I&NNNNNNNNNNNNNNNNNNNNNNTAT0 ;PRINTER 0 CP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;******^1dNNNNNNNNNNNNNNNNNNiZNNNNNNNNNNNNNNNNNNNNNN************************************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********************* ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NONNNNNNNNNNNNNNNNNN,7NNNNNNNNNNNNNNNNNNNNNN: EQU IOER ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;************************************** NNNNNNNNNNNNNNNNN%iNNNNNNNNNNNNNNNNNNNNNN RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1:$NNNNNNNNNNNNNNNNNN+fNNNNNNNNNNNNNNNNNNNNNN IOER ;************************************** ; ; SERIAL CHANNEL 2 (SC2) ; ;************************************** SI2NNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN2, 3: CON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;*********************************************************************?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*******************************\NNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN************************************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= V NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! 20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT READY THEN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR 8NNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNNN LO0: CALL LSTAT0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI1DO),A LD A,NOT [1 SHL PRI1CSBNNNNNNNNNNNNNNNNNN&:NNNNNNNNNNNNNNNNNNNNNN LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A ; IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SzXdNNNNNNNNNNNNNNNNN,|NNNNNNNNNNNNNNNNNNNNNN: EQU IOER SO2: EQU IOER ;************************************** ; ; SERIAL CHANNEL 3 (SC3) ; ;*************************NNNNNNNNNNNNNNNNNNj)NNNNNNNNNNNNNNNNNNNNN!**** CSTS: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 X2rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN****************************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 l3NNNNNNNNNNNNNNNNNN/DNNNNNNNNNNNNNNNNNNNNNN0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************** NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJR Z,CO1 ; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR\ NNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNN] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: LD A,0BFH ;THIS PRINTER N+NNNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNN!ENSE AND A,[1 SHL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; LIST_NNNNNNNNNNNNNNNNN-ONNNNNNNNNNNNNNNNNNNNN!************* SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!;CONSOLE 3 ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOrNNNNNNNNNNNNNNNNN бNNNNNNNNNNNNNNNNNNNNNN JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; ; L NNNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNNN****************** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TONNNNNNNNNNNNNNNNNNydNNNNNNNNNNNNNNNNNNNNNN RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2GsNNNNNNNNNNNNNNNNNN"_NNNNNNNNNNNNNNNNNNNNNNEEDS STB=F FOR BUSY OUT (PRI2CNT),A ; TO WORK PROPERLY ; IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST dNNNNNNNNNNNNNNNNN(5NNNNNNNNNNNNNNNNNNNNN! DEVICE 2 (LST2) ; ;************************************** LO2: EQU IOER LSTAT2: EQU IOER ;****************************HNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;****************************************bNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH:9NNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNSERIAL CHANNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; fNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ACCEPT CHAR THEN WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NTTNNNNNNNNNNNNNNNNNJUNNNNNNNNNNNNNNNNNNNNNN) ; ;************************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;*****************************F$NNNNNNNNNNNNNNNNNN#lNNNNNNNNNNNNNNNNNNNNNNBUSY RET Z ; LD A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;*******************| NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN********** ; ; SERIAL CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER ;********lnNNNNNNNNNNNNNNNNNNN/)NNNNNNNNNNNNNNNNNNNNNN SUBTTL CONSTANTS ;***************************************************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. XBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN**************************** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLNNNNNNNNNNNNNNNNNN zNNNNNNNNNNNNNNNNNNNNNN READY ; ;************************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSd5NNNNNNNNNNNNNNNNNZkNNNNNNNNNNNNNNNNNNNNNN ; SERIAL CHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;***********nWNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNS) ;IF NOT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;*****************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********* ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3~dNNNNNNNNNNNNNNNNNN$XNNNNNNNNNNNNNNNNNNNNNN******************* LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),ANNNNNNNNNNNNNNNNN*WNNNNNNNNNNNNNNNNNNNNNN****************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IOER SO1: EQU`NNNNNNNNNNNNNNNNNN0:NNNNNNNNNNNNNNNNNNNNNN ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***************************************************** TBL: DW ASGN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁k9 ׅuDቯ}L鍶S"𑿒]+ɖf4њn= ڞwF㢲ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNN;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;NNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNDER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL C`9NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brGHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@$NNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNN; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNEQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOCHNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNRETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THEfnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJ DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;SjgNNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '3' ; CONSOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 D$NNNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!eakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtBNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNN!2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#NNNNNNNNNNNNNNNNN xNNNNNNNNNNNNNNNNNNNNN!NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCI&NNNNNNNNNNNNNNNNNN&ҾNNNNNNNNNNNNNNNNNNNNNN EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;--------------------------------------NNNNNNNNNNNNNNNNN,=uNNNNNNNNNNNNNNNNNNNNN! SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP 5NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN! DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- \NNNNNNNNNNNNNNNN fNNNNNNNNNNNNNNNNNNNNNNB '0' ; CONSOLE 0 ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;---------------------------------tNNNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelBNNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNt. ; VERSN EQU '16' ; ;**************************************************************************** FORM FALSE EQU 0 TRUJNNNNNNNNNNNNNNNNN!K)NNNNNNNNNNNNNNNNNNNNNNI DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================ 9NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLEBFNNNNNNNNNNNNNNNNN-DNNNNNNNNNNNNNNNNNNNNNNAND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE CVNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DNNNNNNNNNNNNNNNNN 5NNNNNNNNNNNNNNNNNNNNNN ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DHNNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,HNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INRNNNNNNNNNNNNNNNNN"zNNNNNNNNNNNNNNNNNNNNN!IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPSV EQU 6 ;STACK Pk NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CUNNNNNNNNNNNNNNNNNN.[NNNNNNNNNNNNNNNNNNNNN!OLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; DENNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL C_rNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!B 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80HqNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to uNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDENNNNNNNNNNNNNNNNNN#-KNNNNNNNNNNNNNNNNNNNNNNTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOCKNNNNNNNNNNNNNNNN)€NNNNNNNNNNNNNNNNNNNNNNONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DBNNNNNNNNNNNNNNNNNN/h&NNNNNNNNNNNNNNNNNNNNNNLAY A WHILE FOR HARDWARE TO CATCH UP ; LD HL,0 RESWT: DEC HL LD A,L OR H JR NZ,RESWT ; ; REMOVE PAGE 0 IMAGE ; y^NNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNNHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL REAGNNNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNN + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************eNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhrNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNN BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES NNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN! EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX &GNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS _NNNNNNNNNNNNNNNNNN0{kNNNNNNNNNNNNNNNNNNNNN!OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RS|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNˁh6ԅrAމzI捳P푼Y'Ŗc1Ϛl; ؞uCࢯ}LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNNTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DxmrNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MENNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNNCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;**************************************************************************** MEMSIZ: PU`NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 2^NNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNN! IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= rNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!R NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;----------------------------------------------------(NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT NNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNOUBLE D WINDOW(S) ; LD A,DDOUT ;REMOVE DD WINDOW, IF PRESENT OUT (40H),A OUT (41H),A OUT (42H),A OUT (43H),A ; ; NNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNN!MTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDXlHNNNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNNERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FHNNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNN!SH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A BNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETE^NNNNNNNNNNNNNNNNN O(NNNNNNNNNNNNNNNNNNNNNN# OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;************************************************************************BNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL NNNNNNNNNNNNNNNNN, ENNNNNNNNNNNNNNNNNNNNN!; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;EL&$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG NNNNNNNNNNNNNNNN VNNNNNNNNNNNNNNNNNNNNNN - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP *rNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BsNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNR. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 PFNNNNNNNNNNNNNNNNN!|NNNNNNNNNNNNNNNNNNNNNN**** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z NNNNNNNNNNNNNNNNNN'ֿNNNNNNNNNNNNNNNNNNNNNNPERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE C|#NNNNNNNNNNNNNNNNN-9tNNNNNNNNNNNNNNNNNNNNNNSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WANNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMmNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOWNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;********************************cNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;****************************************************************************NNNNNNNNNNNNNNNNNN")JNNNNNNNNNNNNNNNNNNNNNNEXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBNVNNNNNNNNNNNNNNNNN(ƁNNNNNNNNNNNNNNNNNNNNNNONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= 1NNNNNNNNNNNNNNNNNN.l'NNNNNNNNNNNNNNNNNNNNNNRM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WAR&NNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN CWKNNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST NNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNR EXEC ;**************************************************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP ONNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!******************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR :HNNNNNNNNNNNNNNNNN 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 uHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁k9 ׅuDቯ}L鍷T#]+ʖh7Ԛq@ݞ{J碷U#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP NNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW 4NNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNRRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;--------------------------B NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------ ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFER.qNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNNPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUT@n$NNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNN!IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE ̋BNNNNNNNNNNNNNNNNN%1NNNNNNNNNNNNNNNNNNNNNN---------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE8HNNNNNNNNNNNNNNNNNN+?>NNNNNNNNNNNNNNNNNNNNNN EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FOhHNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAŤNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE BNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!INE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGAM`NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEEU9NNNNNNNNNNNNNNNNNN&IbNNNNNNNNNNNNNNNNNNNNNN SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE.rNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# x$NNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNNINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; ST&BNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNNRM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 _NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;-NNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNN!NIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN I}NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX NNNNNNNNNNNNNNNNNN'zSNNNNNNNNNNNNNNNNNNNNN! ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; yNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNBPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D ORINNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNART ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;-------------------------------------------|NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNAS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;********************************HNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-----------------------------3NNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNN!--------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DAhNNNNNNNNNNNNNNNNNN[ ] ; ;---------------------------------------------------------------------------- DdNNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNLD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRP;rNNNNNNNNNNNNNNNNN(jmNNNNNNNNNNNNNNNNNNNNNNG,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------------------------j?NNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 NNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- BNNNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNNTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CU7HNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNRESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;----------------------------------------------------------onINNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNNA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE NNNNNNNNNNNNNNNNNN$/NNNNNNNNNNNNNNNNNNNNN!RPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;------------------------------------------------------NNNNNNNNNNNNNNNNN* NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALLNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,RESTLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6ԅsB߉{J獴Q Z(Ɩd2Ϛl< ٞwE⢱ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN! LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO RNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN---------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------tNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN----------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTINGOHNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNNY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. NNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNN!THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DrNNNNNNNNNNNNNNNNN%+NNNNNNNNNNNNNNNNNNNNNNF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,^_$NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNLL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3?NNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNN!EG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; '-NNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOL HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;---------------------------------------------------------------NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN ; ; T ; ;---------------------------------------------------------------------------- MTEST: CALL E$NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNISPLAY 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 ; ;d= HEX NUMBER TO PLNNNNNNNNNNNNNNNNNN&~RNNNNNNNNNNNNNNNNNNNNNN(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS L`NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNFH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE%gNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNTHESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;---------------NNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNNLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD ANNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNNONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF AuRNNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNN ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3:yNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNAF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIHNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SETNNNNNNNNNNNNNNNNN(]]NNNNNNNNNNNNNNNNNNNNNNAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z-$NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD LENNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-----------------NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND ,9NNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNN! RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION &fNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;--------------NNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNN!T COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE R>NNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN! IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MAHNNNNNNNNNNNNNNNNN)nlNNNNNNNNNNNNNNNNNNNNNN,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL@NNNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VrNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN--------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;----------------------------NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEF"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-----------------------------------------------------''NNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF A#'NNNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNNET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS ~rNNNNNNNNNNNNNNNNNN$0NNNNNNNNNNNNNNNNNNNNNNTCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;INNNNNNNNNNNNNNNNN*;?NNNNNNNNNNNNNNNNNNNNNN) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CA˷NNNNNNNNNNNNNNNNNN0ׇNNNNNNNNNNNNNNNNNNNNN!ALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;*****************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁k9 ׅvDቯ~MꍷT#^,˖h7Ԛq@ݞyH墵R!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!*********************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & TBNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;***********************************ƌ NNNNNNNNNNNNNNNNNNŶNNNNNNNNNNNNNNNNNNNNNN CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT NNNNNNNNNNNNNNNNN*}NNNNNNNNNNNNNNNNNNNNNN*********************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF (mNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: NNNNNNNNNNNNNNNNN%jNNNNNNNNNNNNNNNNNNNNNNP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HLX]NNNNNNNNNNNNNNNNNN+INNNNNNNNNNNNNNNNNNNNNN LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;*********************************************************QNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!HEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;*************************************************************** EXPR3: INC B ;ANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*********************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXECNNNNNNNNNNNNNNNNN\!NNNNNNNNNNNNNNNNNNNNNNIS SET TO FLAG THE ERR. ; ;*************************************************************** NIBBLE: SUB '0' RET C CP 'G' -\ANNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNCHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;*********tNNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNNDEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC NNNNNNNNNNNNNNNNNNN&?NNNNNNNNNNNNNNNNNNNNNN LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;REtrNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;------------------------------------------------------------------NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN****** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RETNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNNNB HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;**************************************************** NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************************** HILOD:NNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNN '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;***********************************)NNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNN!******************************************************************* ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVNNNNNNNNNNNNNNNNNN!ANNNNNNNNNNNNNNNNNNNNNN ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTNNNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNN!STORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SNNNNNNNNNNNNNNNNN-,NNNNNNNNNNNNNNNNNNNNNN---------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMININNNNNNNNNNNNNNNNNN_RNNNNNNNNNNNNNNNNNNNNNN ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHNNNNNNNNNNNNNNNNN |]NNNNNNNNNNNNNNNNNNNNNN************************ ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OC vgNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CAxNNNNNNNNNNNNNNNNNN:CNNNNNNNNNNNNNNNNNNNNNN***************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITNNNNNNNNNNNNNNNNNNՈNNNNNNNNNNNNNNNNNNNNNNER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE }NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1,  rNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX ANNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES ErNNNNNNNNNNNNNNNNNlcNNNNNNNNNNNNNNNNNNNNN!OS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*************************************************************** DECHO: CALL DAn 9NNNNNNNNNNNNNNNNNN OlNNNNNNNNNNNNNNNNNNNNNNCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; -NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILONNNNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNNNER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;***************INNNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNNNRESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE !NNNNNNNNNNNNNNNN)/NNNNNNNNNNNNNNNNNNNNNNF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R .NNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNNA WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;------------NNNNNNNNNNNNNNNNNN90NNNNNNNNNNNNNNNNNNNNNNSH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RPNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND JP CONI ;ELSE WAIT FOR NEXT CHAR ;*************************************************************** ; ; NIBBLE ROUTINENNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNIF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;*****************************9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************************************* REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALNNNNNNNNNNNNNNNNNN$YNNNNNNNNNNNNNNNNNNNNNN ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT PO7NNNNNNNNNNNNNNNNNN*zNNNNNNNNNNNNNNNNNNNNN!LD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B F'NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNˁh6Ӆq@݉yI捳P푼Y'Ŗc1Κk:מtBߢ|KNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHL,IOMSG JR COMERR ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------NNNNNNNNNNNNNNNNNN=1NNNNNNNNNNNNNNNNNNNNNNUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUBNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;***bNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!E DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD[NNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNN*************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR cNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; C= CHAR ; ;***************************************************************`NNNNNNNNNNNNNNNNN%]NNNNNNNNNNNNNNNNNNNNN!, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH JP Z,TTST ;SYSTEM CONSOLE CP 8 JP M,PTRST ;PAPER TAPE RDR JP Z,RUSENNNNNNNNNNNNNNNNNN+~NNNNNNNNNNNNNNNNNNNNNN ;******************************************************************** RI: LD A,(IOBYTE) AND 0CH JP Z,TTYRDR ;SYSTEM CONSONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- 6NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!************************************************************************* PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) R3*$NNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNN! HL,CRMSG CALL PRTWA POP HL RET ;*************************************************************** ; ; LADR ROUTINE OƹNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN! ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERSNNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNN********** LO: LD A,(IOBYTE) AND 0C0H JP Z,TTYOUT ;SYSTEM CONSOLE CP 80H JP M,CRTOUT ;CRT JP Z,LPRT ;LINE PRINTER eNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNT1 ;USER 1 JP RUST2 ;USER 2 ;******************************************************************** ; ; CONSOLE INPUT  NNNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNNNLE CP 8 JP M,PTRIN ;PAPER APE RDR JP Z,RUSI1 ;USER 1 JP RUSI2 ;USER 2 ;*****************************************FdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;**************************************)rNNNNNNNNNNNNNNNN >NNNNNNNNNNNNNNNNNNNNNNOUT POP HL POP AF RRA RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;*********************************************IprNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET NNNNNNNNNNNNNNNNNX NNNNNNNNNNNNNNNNNNNNNNUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LANNNNNNNNNNNNNNNNNN{/NNNNNNNNNNNNNNNNNNNNNN ;******************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- (IOBYTE BIT 0..1): 0: TTYnNNNNNNNNNNNNNNNNN!qNNNNNNNNNNNNNNNNNNNNN!JP LUSE1 ;USER 1 ;************************************************************************* ; ; CONSOLE STATUS INPUT ; e9NNNNNNNNNNNNNNNNNN';NNNNNNNNNNNNNNNNNNNNNN; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USR1 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;*****************************i1dNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN******************************** ; ; LIST DEVICE STATUS INPUT ; ENTRY- (IOBYTE BIT 6..7)= 0:TTY, 40H: CRT, 80H: LPT, C0H: USR#DHNNNNNNNNNNNNNNNNNNhbNNNNNNNNNNNNNNNNNNNNNN************************************** ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERANNNNNNNNNNNNNNNNN KmNNNNNNNNNNNNNNNNNNNNNN*********************** ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;*********************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;*************************************************************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE HNNNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNNDR). ; ;*************************************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN, 1: CRT, 2: BAT, 3: USR1 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYT!NNNNNNNNNNNNNNNNN""NNNNNNNNNNNNNNNNNNNNNNENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USER 1 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;******************dNNNNNNNNNNNNNNNNN(+NNNNNNNNNNNNNNNNNNNNNN*************************************** CI: LD A,(IOBYTE) AND 3 JP Z,TTYIN ;SYSTEM CONSOLE CP 2 JP M,CRTIN ;CRT JP NNNNNNNNNNNNNNNNNN.ONNNNNNNNNNNNNNNNNNNNNN1 ; EXIT - A= 0: BUSY, FFH: READY ; ;************************************************************************* LSTAT: LD A,(NNNNNNNNNNNNNNNNN[SNNNNNNNNNNNNNNNNNNNNNNL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;***************************************8NNNNNNNNNNNNNNNNNN x\NNNNNNNNNNNNNNNNNNNNNN*********************************** CONI: CALL CI AND 7FH RTS: RET ;***************************************************[BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; & HL REGS, THEN DOES A CR-LF. ; ;*************************************************************** EXLF: CALL EXPR POP DErNNNNNNNNNNNNNNNNNN>BNNNNNNNNNNNNNNNNNNNNNNHEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;**********************************xNNNNNNNNNNNNNNNNNщNNNNNNNNNNNNNNNNNNNNN!E) AND 3 JP Z,TTYOUT ;SYSTEM CONSOLE CP 2 JP M,CRTOUT ;CRT JP NZ,CUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUoNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN******************************************************* CSTS: LD A,(IOBYTE) AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,xNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!NZ,CUSI1 ;USER 1 ; BATCH INPUT FALLS INTO READER VECTOR ;*****************************************************************cNNNNNNNNNNNNNNNNNN/~NNNNNNNNNNNNNNNNNNNNNNIOBYTE) AND 0C0H JP Z,TTOST ;SYSTEM CONSOLE CP 80H JP M,CRTOST ;CRT JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!************************************* QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT Q+NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN************************* ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BITNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN POP HL ;*************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOL=NNNNNNNNNNNNNNNNNN.|NNNNNNNNNNNNNNNNNNNNNN************************ ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;*******************************************8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT *** ;************************************************************************* ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BcNNNNNNNNNNNNNNNNNN$nNNNNNNNNNNNNNNNNNNNNNNCRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE STATUS INPUT FALLS THROUGH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTRNNNNNNNNNNNNNNNNNNN*MNNNNNNNNNNNNNNNNNNNNN!*** ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)= 0: TTY, 4: PTR, 8: USR1, CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ;8HNNNNNNNNNNNNNNNNNN03NNNNNNNNNNNNNNNNNNNNNN ;************************************************************************* ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρl: ׅuD≰N델U$^,ʖh7ԚrAޞ|J碶T#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNtINNNNNNNNNNNNNNNNNNNNNN5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CHAR ; ;********************************************************************^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETURN 0 CPL AND 1 SHL NTBSY JR TTOST1 ;*****************************@NNNNNNNNNNNNNNNNN 1$NNNNNNNNNNNNNNNNNNNNNN BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET C3uBNNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNN!**************************** ; ; ALTERNATE READER DEVICE (PTR) ; ;************************************** PTRIN: EQU IOER P NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!************************* ; ; ALTERNATE PUNCH DEVICE (UP1) ; ;************************************** PUSO1: EQU IOER ;**6NNNNNNNNNNNNNNNNNNNT5NNNNNNNNNNNNNNNNNNNNNNUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***************************************************** TBL: DW ASGN ;A DW BOO 9NNNNNNNNNNNNNNNNN%kNNNNNNNNNNNNNNNNNNNNNNDB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; PUNCH TO HIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOL.NNNNNNNNNNNNNNNNNN+dNNNNNNNNNNNNNNNNNNNNN!C + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C'uNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN***** PUNO: LD A,(IOBYTE) AND 30H JP Z,TTPNCH ;SYSTEM CONSOLE CP 20H JP M,HSP ;HIGH SPEED PUNCH JP Z,PUSO1 ;USER 1 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********* ; ; ALTERNATE CONSOLE DEVICE (CRT) ; ;************************************** CRTIN: CALL CRTST ;IF NOT READY f'NNNNNNNNNNNNNNNNNNdwNNNNNNNNNNNNNNNNNNNNNNENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTRST: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (UR1) ; ;*****************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************ ; ; ALTERNATE PUNCH DEVICE (UP2) ; ;************************************** PUSO2: EQU ANNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNN!TC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRTNNNNNNNNNNNNNNNNNN&8NNNNNNNNNNNNNNNNNNNNNNE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; READER TO HNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN,CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN JP PUSO2 ;USER 2 SUBTTL PRIMITIVE I/O DRIVERS ;************************************** ; ; PRIMARY CONSOLE DEVICE (TTY)rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNTHEN WAIT JR Z,CRTIN IN A,BZUDAT ;INPUT CHAR RET CRTOUT: CALL CRTOST ;IF NOT READY THEN WAIT JR Z,CRTOUT LD A,CzNNNNNNNNNNNNNNNNNNWFNNNNNNNNNNNNNNNNNNNNNNTOUT),A RET LPRST: IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z LD A,-1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********* RUSI1: EQU IOER RUST1: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (UR2) ; ;9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIOER ;************************************** ; ; ALTERNATE LIST DEVICE (UL1) ; ;**************************************NNNNNNNNNNNNNNNNN!rNNNNNNNNNNNNNNNNNNNNNN ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTESTTrNNNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNNIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSOLE ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #YNNNNNNNNNNNNNNNNN-7NNNNNNNNNNNNNNNNNNNNNNH DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END 6NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ;************************************** TTYIN: CALL TTST ;IF CHAR NOT READY THEN WAIT JR Z,TTYIN IN A,NTD ;ELSE RENNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;OUTPUT CHAR OUT BZUDAT,A RET CRTST: IN A,BZUST ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR CRTST1: RET Z LD A,q!NNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNN ;ELSE RETURN -1 RET ; ADDITIONAL I/O DEVICES ;************************************** ; ; ALTERNATE CONSOLE DEVICE (ULHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************** RUSI2: EQU IOER RUST2: EQU IOER ;************************************** ; ; PRIMNNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF +'NNNNNNNNNNNNNNNNNN"'NNNNNNNNNNNNNNNNNNNNNN ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTEdNNNNNNNNNNNNNNNNN(7NNNNNNNNNNNNNNNNNNNNNN1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'C' ; CONSOLE TO CRT DB 'T' ; CONSOLE TO SYSTEM CONSOLE ;------------NNNNNNNNNNNNNNNNNN.bNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!TURN CHAR RET TTYOUT: CALL TTOST ;IF NOT READY TO ACCEPT CHAR THEN WAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN-1 ;ELSE RETURN -1 RET CRTOST: IN A,BZUST ;IF TXRDY NOT TRUE THEN RETURN 0 AND BZUTXR JR CRTST1 ;*************jNNNNNNNNNNNNNNNNNNw:NNNNNNNNNNNNNNNNNNNNNNC1) ; ;************************************** CUSI1: EQU IOER CUSO1: EQU IOER CUST1: EQU IOER ;***********************kBNNNNNNNNNNNNNNNNNNݜNNNNNNNNNNNNNNNNNNNNNNARY PUNCH DEVICE (TTY) ; ;************************************** TTPNCH: EQU IOER ;************************************** *'NNNNNNNNNNNNNNNNN2WNNNNNNNNNNNNNNNNNNNNN! USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTLRNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN--------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',NNNNNNNNNNNNNNNNNNN/QNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETU8yNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN************************* ; ; ALTERNATE LIST DEVICE (LPT) ; ;************************************** LPRT: CALL LPRST ;IFNNNNNNNNNNNNNNNNN"iNNNNNNNNNNNNNNNNNNNNNN*************** ; ; PRIMARY READER DEVICE (TTY) ; ;************************************** TTYRDR: EQU IOER ;**********,NNNNNNNNNNNNNNNNNN͢NNNNNNNNNNNNNNNNNNNNNN ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;************************************** HSP: EQU IOER HSPST: EQU IOER ;*************W/NNNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN CONSTANTS ;***************************************************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXEC[dNNNNNNNNNNNNNNNNNN$ZNNNNNNNNNNNNNNNNNNNNNNE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'T' ; LIST TO SYSTEM CONSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE NNNNNNNNNNNNNNNNNN*UNNNNNNNNNNNNNNNNNNNNN!BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLONNNNNNNNNNNNNNNNNN0BNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6҅p?܉yH即Q [)Ɩd3њn= ڞwE⢲PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCyNNNNNNNNNNNNNNNNNNNNNN TITLE Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEM MON($NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4KBNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!EF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;=== jNNNNNNNNNNNNNNNNNN&hNNNNNNNNNNNNNNNNNNNNNNH DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25HA_NNNNNNNNNNNNNNNNNɣNNNNNNNNNNNNNNNNNNNNN!SER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN `NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNN!D HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; LD SP,80H ;SET UP TEMPORARY STACK yNNNNNNNNNNNNNNNNN%[NNNNNNNNNNNNNNNNNNNNNNLL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR ; LD SP,HL ;MOVE EXIT RTN TO RAM LD DE,EXIT EX$NNNNNNNNNNNNNNNNNN+TNNNNNNNNNNNNNNNNNNNNNN HERE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUWCNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNITOR FOR Z80 ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*************************************************************}NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectl NNNNNNNNNNNNNNNNNNSGNNNNNNNNNNNNNNNNNNNNNN========================= ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER mNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14NaNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME SKdNNNNNNNNNNNNNNNNN vNNNNNNNNNNNNNNNNNNNNNNLD A,DDOUT ;REMOVE DD WINDOW, IF PRESENT OUT DDPORT,A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUEÏNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN DE,HL LD BC,ENDX - EXIT LDIR LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR LD HL,-24NNNNNNNNNNNNNNNNN,3NNNNNNNNNNNNNNNNNNNNNNL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK ; NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS rNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program breakpNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNy. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to beNNNNNNNNNNNNNNNNNN`vNNNNNNNNNNNNNNNNNNNNNNOF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3 ?FNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP AND 7 *BNNNNNNNNNNNNNNNNN!ENNNNNNNNNNNNNNNNNNNNNN CALL IOSET LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER >dNNNNNNNNNNNNNNNNNN'9NNNNNNNNNNNNNNNNNNNNNN ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE LD D,10 ;INIT NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNIN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD JR WINIT ;GO TO MONITOR EXEC ;***************FHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as this RBNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! on stack. ; VERSN EQU '15' ; ;************************************************************* FORM FALSE EQU 0 TRUE EQU N~NNNNNNNNNNNNNNNNNs;NNNNNNNNNNNNNNNNNNNNNNCR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================ IOBYTE G$NNNNNNNNNNNNNNNNNNٝNNNNNNNNNNNNNNNNNNNNNNJUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT INNNNNNNNNNNNNNNNNN6VNNNNNNNNNNNNNNNNNNNNN!;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD ININNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN ; COMPUTE # KS LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM'INNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNREGISTER STORAGE AREA WITH 0 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; BIG Z 8251 INITIALIZATION ; XOR A ;GET IT'S ATTEN)rNNNNNNNNNNNNNNNNNN.UNNNNNNNNNNNNNNNNNNNNNN************************************************ ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT ; SEARCHES FROM THENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOM. ; ;************************************************************* ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Ad~NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BBNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNN!EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPSV EQU 6 ;STACK PTR SAVE;dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE +NNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNTIALIZATION CODE ; ;-------------------------------------- INIT: DI LD HL,0 ;DELAY A WHILE FOR HARDWARE TO CATCH UP RESWT^INNNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNN!1 INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 T8{INNNNNNNNNNNNNNNNN)6NNNNNNNNNNNNNNNNNNNNNNTION 1ST LD B,5 URTLP: OUT BZUDAT,A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE NNNNNNNNNNNNNNNNNN/fNNNNNNNNNNNNNNNNNNNNNN BOTTOM UP UNTIL A NON-RAM LOCATION IS ; FOUND. IT THEN TAKES OFF FOR MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;*RNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image NNNNNNNNNNNNNNNNNN 5%NNNNNNNNNNNNNNNNNNNNN!IGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DdNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12L!$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSTATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE U7NNNNNNNNNNNNNNNNNNP4NNNNNNNNNNNNNNNNNNNNNN: DEC HL LD A,L OR H JR NZ,RESWT OUT COLDRES,A ;NOW REMOVE PAGE 0 IMAGE LD SP,3FH ;USE STACK TO INIT RESTARTS L;NNNNNNNNNNNNNNNNNN$jNNNNNNNNNNNNNNNNNNNNN!HEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CAONNNNNNNNNNNNNNNNN*eNNNNNNNNNNNNNNNNNNNNNNOUT BZUCMD,A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT BZUCMD,A IN A,BZUDAT ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE5jBNNNNNNNNNNNNNNNNN0uNNNNNNNNNNNNNNNNNNNNNN************************************************************** MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNN΁k9 ؅vDተN덹V%’`.͖k9֚sBߞ|J碶U#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 LD A,H ;SEE IF ON MONITOR BORDER CgNNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;****************************NNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNNN***************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARNNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNOF PHYSICAL ; PERIPHERALS TO THE 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) ; TO MATCH THE CURRENT ASSIGNMENT. THE 4 LOGICALQNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; HNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!LS A BLOCK OF MEMORY WITH A USER ; DEFINED CONSTANT. IT EXPECTS 3 PARAMETERS TO BE ENTERED IN ; THE FOLLOWING ORDER: ; STARP}NNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNL LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYHNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNSTEM LOCKS UP & WILL NOT RESPOND TO ; ANYTHING OTHER THAN 2 ASCII BELL CHARACTERS. WHEN IT SEES ; THEN CONSECUTIVELY, CONTROzHNNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNN!P B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC NNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNN!********** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;*******************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!AMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLENNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNN DEVICES ARE ; CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE TTY DEVICE ; (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVIC/ENNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNTHE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURNHNNNNNNNNNNNNNNNNN 7*NNNNNNNNNNNNNNNNNNNNNNT ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;---------------------------------------------NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!TE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SEPNNNNNNNNNNNNNNNNN,rGNNNNNNNNNNNNNNNNNNNNNNL IS RETURNED TO THE MONITOR ; WITHOUT ALTERING ANYTHING. ; ; Z ; ;--------------------------------------------------{NNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNN;UNPREDICTABLE DURING INIT RET ;********************************************************** ; ; MEMCHK SUBR FINDS THE CURR]NNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNN************************* ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & ; DEVELOPS A 16 BIT HEX FOR EACH ONE. A CARRIAGO NNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DBNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,NNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;I;.NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN------------------ FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR dNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNT IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEWNNNNNNNNNNNNNNNNNN-AvNNNNNNNNNNNNNNNNNNNNNN------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENT TOP OF CONTIGUOUS ; MEMORY (LESS THE MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTEprNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNE RETURN WILL ; TERMINATE THE ENTRY SEQUENCE. A BLANK OR COMMA WILL END THE ; CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY T`NNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIMKHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNUR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;--------------------------------------NNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LDC.$NNNNNNNNNNNNNNNNNN"QHNNNNNNNNNNNNNNNNNNNNNN JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONDNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN! ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VAqNNNNNNNNNNNNNNNNNN.%NNNNNNNNNNNNNNNNNNNNN!ECHO THE BELL DJNZ BYE1 RET ;--------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND 6NNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN OF RAM ; ;********************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,XrNNNNNNNNNNNNNNNNNN 6NNNNNNNNNNNNNNNNNNNNNNAKES THE LAST ; 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WAdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;---------------------------b NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT $NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,gNNNNNNNNNNNNNNNNNN#byNNNNNNNNNNNNNNNNNNNNNNTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2 rNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNLUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;-----------------------------------------NNNNNNNNNNNNNNNNNN/'NNNNNNNNNNNNNNNNNNNNNN ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH ; OTHER. IF A DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS ; D{NNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNNL ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;**************************************NNNNNNNNNNNNNNNNNN tNNNNNNNNNNNNNNNNNNNNN!RM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;***************************************yNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN------------------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT QHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN- ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA JP (HL) ;--------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILdHNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC 3BNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN---------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE ; OF THE SYSTEM. THE SYNNNNNNNNNNNNNNNNN04YNNNNNNNNNNNNNNNNNNNNNNETECTED, THE ADDRESS OF THE 1ST BLOCK IS DISPLAYED, ALONG ; WITH IT'S CONTENTS & THE CONTENTS OF THE OTHER BLOCK'S SAME ; RENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh6ԅr@݉zI捴Q \*Ȗe4Қo> ۞xF㢲PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNN!LATIVE ADDRESS. ; ; V ; ;-----------------------------------------NNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;---------- NNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNN'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YESHNNNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNN ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ;4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D I=cNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDEVICE. ; ; I ; ;--------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT5NNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNSTART_ADDR> ; ;---------------------------------------------------------- MOVE: CALL EXPR3 MOHNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!NTS, IF DESIRED & IF THE ADDRESS ; IS IN RAM. THE CONTENTS MAY BE LEFT UNALTERED BY ENTERING A ; SPACE, COMMA OR RETURN. IF =NNNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNN!---------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOWNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDRS?NNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPAR@rNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNNC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHARd'NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT NNNNNNNNNNNNNNNNN,EwNNNNNNNNNNNNNNNNNNNNNNA RETURN IS ENTERED, THE ROUTINE ; IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ROUTINE ; PROCEEDS TO THE NEXT LOCATIONNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ; ^INNNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNNN LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALzNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET 9NNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNN BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF8BNNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNN! = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POPNNNNNNNNNNNNNNNNNN!3+NNNNNNNNNNNNNNNNNNNNNN ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0.cKHNNNNNNNNNNNNNNNNNN-vFNNNNNNNNNNNNNNNNNNNNNNN & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-------------------------------------------------qsNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNFORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------- NNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNNNL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS C„NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LO ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E 8NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN.7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFYNNNNNNNNNNNNNNNNNN.#NNNNNNNNNNNNNNNNNNNNNN-------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN----------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE ; CONSOLE DEVICE. THE USER NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HyNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!ONTROL TO A SPECIFIED ADDRESS ; IT ALLOWS THE SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS ; WELL AS ALLOWING ANY CONSOLE INPlNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!CATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD NNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;---------------------------------------------------PNNNNNNNNNNNNNNNNNN#UINNNNNNNNNNNNNNNNNNNNN! RET ;---------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS,7NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-------------------------------------------------------BDNNNNNNNNNNNNNNNNNN/$NNNNNNNNNNNNNNNNNNNNNN CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LrNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNN MUST SPECIFY THE START & FINISH ; ADDRESSES. THE DISPLAY IS ORGANIZED TO DISPLAY UP TO 16 ; BYTES PER DISPLAY LINE, WITH ALNNNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNNL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,BNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNUT TO BREAKPONT THE RUN, AS ; LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) rNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNHL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN------------ ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM ; THE CURRENT CONSOLE H=NNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN ENTERED IN THE ; FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & ; DESTINATION 1ST BYTE ADDR. ; ; M<׻NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!-------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY ; LOCATION & ALTER THE CONTE NNNNNNNNNNNNNNNNN0iNNNNNNNNNNNNNNNNNNNNNNF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNρl: ؅vE≱N덹W&Òa/͖k9֚sBߞ|J碵S"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNLD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL NNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCANNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNNL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XA$NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNCTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE NNNNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNN*********** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;**********NNNNNNNNNNNNNNNNN%SNNNNNNNNNNNNNNNNNNNNN!S FOR (& ; DISALLOWS) A WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY ; BIT WILL BE SET ON RETURN. IF NO WRAP-AROUND OCCURR?NNNNNNNNNNNNNNNNNN+p NNNNNNNNNNNNNNNNNNNNNN HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF NNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;-----------------------NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN! LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;----------------------_$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!B: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL .NNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNN!N LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OFJNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV$NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN***************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A \rNNNNNNNNNNNNNNNNNN&PNNNNNNNNNNNNNNNNNNNNNNED, HL ; IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;*************************************************************** $NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNCHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;***********************************VNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN!---------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE ; IF ANY HARD DATA BIT FNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!--------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND INSPECTS THE VALUES OF THE ; REGISTERS STONNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNPRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL NNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;N NNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;*************************************************************** ; ; CONVE/NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN! ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;**************************************************NNNNNNNNNNNNNNNNNN'5aNNNNNNNNNNNNNNNNNNNNNNHILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,4NNNNNNNNNNNNNNNNNN-ڪNNNNNNNNNNNNNNNNNNNNNN**************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF ^NNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNAILURES EXIST. IT IS NOT AN EXHAUSTIVE ; TEST, BUT JUST A QUICK INDICATION OF THE MEMORY'S ; OPERATIVENESS. ; ; T ;DISPLAY ALL REGISTER VALUES ; NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNN;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (Sw NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. IT PUTS THE RESULT INTO ; C FOR LATER O(NNNNNNNNNNNNNNNNNN"ʔNNNNNNNNNNNNNNNNNNNNNN************* ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;***********4>NNNNNNNNNNNNNNNNN(%_NNNNNNNNNNNNNNNNNNNNNNH RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & bNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNTHE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;**************************************************_NNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNDDR> ; ;--------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSHvNNNNNNNNNNNNNNNNNNN vNNNNNNNNNNNNNNNNNNNNNN ;r= 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 ; ;-----CNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TfNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!LLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIB NNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNUTPUT. ; ;*************************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DmNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!**************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;HNNNNNNNNNNNNNNNNN)nNNNNNNNNNNNNNNNNNNNNN!IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;*****************]9NNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN************* NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN AF CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A NNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,AHNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN8NNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNN!AA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;****************************************************_NNNNNNNNNNNNNNNNNN$`2NNNNNNNNNNNNNNNNNNNNN!GO DO CRLF ;*************************************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKSONNNNNNNNNNNNNNNNNNN*C=NNNNNNNNNNNNNNNNNNNNNN***************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC}srNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN0 RET ;*************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNˁi7ԅr@݉zI捴Q [)Ɩd2Ϛl; ؞uCࢯ~MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOLE, THEN ; CHECKS IT FOR A DELIMITER. IF IT IS NOT A DELIMITER, A NON- ; ZERO CONDITION IS RETURNED. IF IT IS A DELIMITER, NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOR LATER ACCESS ; AND USE BY THE GOTO & THE EXAMINE REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF RNNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLO#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,ANNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNS A WARM ; INIT OF THE MONITOR. THE I/O ERROR CAUSES THE I/O ASSIGNMENTS ; TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-----NNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNNTS ARE. NO ; PARAMETERS (OTHER THAN A CR) ARE REQUIRED ON ENTRY. ; ;********************************************************ruNNNNNNNNNNNNNNNNNN%d3NNNNNNNNNNNNNNNNNNNNNN***** CONI: CALL CI AND 7FH RTS: RET ;*************************************************************** ; ; PRTWD ROUTIHNNNNNNNNNNNNNNNNNN+GNNNNNNNNNNNNNNNNNNNNNN------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= ME7NNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNTS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA NNNNNNNNNNNNNNNNN(oNNNNNNNNNNNNNNNNNNNNN!********************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ,NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN******************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHERayNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNLSE RETURN NC RET ;*************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REʋBNNNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNN 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE |NNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNN! E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOydNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN--------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ; ASSIGNMENT ERROR; & CERTAIN PROGRAM ERRORS (DETERMINذNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;********************************************tqNNNNNNNNNNNNNNNNNN#ΕNNNNNNNNNNNNNNNNNNNNNNRRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; NNNNNNNNNNNNNNNNN)!^NNNNNNNNNNNNNNNNNNNNNN ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;************************************************%NNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*****************************************NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNGISTER CONTENTS ; WHENEVER A RESTART 1 INSTRUCTION IS EXECUTED. THE TRAPPED ; CONTENTS ARE STORED IN THE SYSTEM STACK AREA F8NNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNED BY ; PARTICULAR ROUTINE WHERE THE ERROR CONDITION WAS ENCOUNTERED) ; EACH CAUSES A UNIQUE MESSAGE TO BE PRINTED, THEN DOENNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNN******************* ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT ; LOGICAL-PHYSICAL PERIPHERAL DEVICE ASSIGNMENNNNNNNNNNNNNNNNNNN$WNNNNNNNNNNNNNNNNNNNNNNCONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;*************************************************************** 3!NNNNNNNNNNNNNNNNN*t NNNNNNNNNNNNNNNNNNNNN!*************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;************wrNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN********************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HE4uNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁k9 ׅuC}L鍷T#^,ʖg5Қo> ۞xF㢲PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS1$NNNNNNNNNNNNNNNNNNE3NNNNNNNNNNNNNNNNNNNNNNP M,CRTOUT ;CRT JP NZ,CUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUT *** ;*****************************************>NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!**** CSTS: LD A,(IOBYTE) AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,CRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN VECTOR ;******************************************************************** ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)=SrNNNNNNNNNNNNNNNNNeONNNNNNNNNNNNNNNNNNNNNNCP 80H JP M,CRTOST ;CRT JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 ;************************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNADY TO ACCEPT CHAR THEN WAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN OUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR NNNNNNNNNNNNNNNNNN%%NNNNNNNNNNNNNNNNNNNNNN;IF TXRDY NOT TRUE THEN RETURN 0 AND BZUTXR JR CRTST1 ;************************************** ; ; ALTERNATE LIST DEVI*NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!SI1: EQU IOER CUSO1: EQU IOER CUST1: EQU IOER ;************************************** ; ; PRIMARY READER DEVICE (TTY) 3$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEXbNNNNNNNNNNNNNNNNNU NNNNNNNNNNNNNNNNNNNNNN******************************** ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; tNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSTATUS INPUT FALLS THROUGH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH5RmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! 0: TTY, 4: PTR, 8: USR1, CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN************************* ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CQNNNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNNNOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETNNNNNNNNNNNNNNNNNN&pNNNNNNNNNNNNNNNNNNNNN!CE (LPT) ; ;************************************** LPRT: CALL LPRST ;IF BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDSTZNNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNNN; ;************************************** TTYRDR: EQU IOER ;************************************** ; ; ALTERNATE READER3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BLNNNNNNNNNNNNNNNNN f ۉxF㍱N둺V$]+Țe4Оm; آuCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNإNNNNNNNNNNNNNNNNNNNNNN*************** TTPNCH: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;***********3$NNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;**************************************NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLOGICAL LIST DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB‰$NNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelNNNNNNNNNNNNNNNNN+1NNNNNNNNNNNNNNNNNNNNNNt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*************************** HSP: EQU IOER HSPST: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEV`NNNNNNNNNNNNNNNNNb=NNNNNNNNNNNNNNNNNNNNN!*************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***7NNNNNNNNNNNNNNNNNNțNNNNNNNNNNNNNNNNNNNNN!T' ; LIST TO SYSTEM CONSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE ~NNNNNNNNNNNNNNNNN$#NNNNNNNNNNNNNNNNNNNNNN 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIҜNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&GNNNNNNNNNNNNNNNNNNNNN!ease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,9NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNot from reset function. ; VERSN EQU '17' ;**************************************************************************** FORMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ICE (UP1) ; ;************************************** PUSO1: EQU IOER ;************************************** ; ; ALTERNATINNNNNNNNNNNNNNNNN Q NNNNNNNNNNNNNNNNNNNNNN************************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#1 DB 'P' ; PUNCH TO HIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOLE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE D:NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOCk NNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!CNNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEM9NNNNNNNNNNNNNNNNNN'tNNNNNNNNNNNNNNNNNNNNNNning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to uBNNNNNNNNNNNNNNNNN-.NNNNNNNNNNNNNNNNNNNNN! FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE NNNNNNNNNNNNNNNNN'PNNNNNNNNNNNNNNNNNNNNNNE PUNCH DEVICE (UP2) ; ;************************************** PUSO2: EQU IOER ;************************************** f; NNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNN!DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DWlNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; READER TO HIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSNNNNNNNNNNNNNNNNNNBANNNNNNNNNNNNNNNNNNNNN! DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************eyNNNNNNNNNNNNNNNNN(dNNNNNNNNNNNNNNNNNNNNNNboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhNNNNNNNNNNNNNNNNNN.}NNNNNNNNNNNNNNNNNNNNN!MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONB"NNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNN; ; ALTERNATE LIST DEVICE (UL1) ; ;************************************** LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSA5NNNNNNNNNNNNNNNNNN 7nNNNNNNNNNNNNNNNNNNNNN! OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DWnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOLE ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'NNNNNNNNNNNNNNNNNNqpNNNNNNNNNNNNNNNNNNNNNN INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN#!NNNNNNNNNNNNNNNNNNNNNN****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brGNNNNNNNNNNNNNNNNN)WNNNNNNNNNNNNNNNNNNNNNNe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@NNNNNNNNNNNNNNNNNN/LNNNNNNNNNNNNNNNNNNNNNNOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLNNNNNNNNNNNNNNNNNA2NNNNNNNNNNNNNNNNNNNNNNGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG:KNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!C' ; CONSOLE TO CRT DB 'T' ; CONSOLE TO SYSTEM CONSOLE ;--------------------------------- ; ; Z80 REGISTER OFFSET TABi$NNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$!NNNNNNNNNNNNNNNNNNNNNNeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVt'NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#HNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTARDINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNρm< څxG䉳QY(Œb0͖j8՚sBߞ|J梵S"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTh9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;--------------------“NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNMUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,Cn'NNNNNNNNNNNNNNNNNN۩NNNNNNNNNNNNNNNNNNNNNN1H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SNNNNNNNNNNNNNNNNNNN4bNNNNNNNNNNNNNNNNNNNNN!P,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL `NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS .pHNNNNNNNNNNNNNNNNNN%tNNNNNNNNNNNNNNNNNNNNNN,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 !NNNNNNNNNNNNNNNNNN+WNNNNNNNNNNNNNNNNNNNNN!******************* ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;*********INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------------------ ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONe NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;--------------------------------NNNNNNNNNNNNNNNNNB>NNNNNNNNNNNNNNNNNNNNN!IZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE NNNNNNNNNNNNNNNNNNa1NNNNNNNNNNNNNNNNNNNNNNDEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL S NNNNNNNNNNNNNNNNNN oNNNNNNNNNNNNNNNNNNNNNNCARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD H$;NNNNNNNNNNNNNNNNNN&!NNNNNNNNNNNNNNNNNNNNN! MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURIPXNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN***************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;************************jNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPhNNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNNNIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT yNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------ ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED dNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNNFOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 1NNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNTACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8NNNNNNNNNNNNNNNNN!^NNNNNNNNNNNNNNNNNNNNNNL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;***************************************************************JNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNNG INIT RET ;**************************************************************************** ; ; MEMCHK SUBR FINDS THE CURNNNNNNNNNNNNNNNNNN-3NNNNNNNNNNNNNNNNNNNNNN**************************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX XNNNNNNNNNNNNNNNNNAMNNNNNNNNNNNNNNNNNNNNNNSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H A!NNNNNNNNNNNNNNNNN bBNNNNNNNNNNNNNNNNNNNNNN CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK }DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK T)\NNNNNNNNNNNNNNNNNN$\NNNNNNNNNNNNNNNNNNNNN!0 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,CrNNNNNNNNNNNNNNNNN˗NNNNNNNNNNNNNNNNNNNNNN251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP NNNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNN************* ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATIONlrNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTjNNNNNNNNNNNNNNNNNN.`NNNNNNNNNNNNNNNNNNNNNN ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. fDNNNNNNNNNNNNNNNNNr|NNNNNNNNNNNNNNNNNNNNNNBLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLNNNNNNNNNNNNNNNNNN QsNNNNNNNNNNNNNNNNNNNNNN JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LIBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY Sw NNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNN! ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GA)nNNNNNNNNNNNNNNNNNN#:NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN---------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PA&0NNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNEXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED ANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHEINNNNNNNNNNNNNNNNNN%CNNNNNNNNNNNNNNNNNNNNNN BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---------------------------------------------------------------------------- [ ] ; ;---------------------------rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD TNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,Uk,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL09NNNNNNNNNNNNNNNNNF?NNNNNNNNNNNNNNNNNNNNNNUE> ; ;---------------------------------------------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD @NNNNNNNNNNNNNNNNNNe0NNNNNNNNNNNNNNNNNNNNNN VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************NNNNNNNNNNNNNNNNNN!nNNNNNNNNNNNNNNNNNNNNN!ING. ; ; Z ; ;---------------------------------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 NNNNNNNNNNNNNNNNNN'%NNNNNNNNNNNNNNNNNNNNNN COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IFΰNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR L1NNNNNNNNNNNNNNNNNv}NNNNNNNNNNNNNNNNNNNNN!HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LDZNNNNNNNNNNNNNNNNN UrNNNNNNNNNNNNNNNNNNNNNNC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;-----@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,_@NNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN(HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ;OeINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;**************************************>NNNNNNNNNNNNNNNNNN"=NNNNNNNNNNNNNNNNNNNNNNCHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;------yNNNNNNNNNNNNNNNNN(5NNNNNNNNNNNNNNNNNNNNNN S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL rNNNNNNNNNNNNNNNNNN.PNNNNNNNNNNNNNNNNNNNNNND A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HE"=rNNNNNNNNNNNNNNNNNELNNNNNNNNNNNNNNNNNNNNNN A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;NNNNNNNNNNNNNNNNNN fCNNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD ?NNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE }rNNNNNNNNNNNNNNNNNϖNNNNNNNNNNNNNNNNNNNNN!***** ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: NNNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2WLNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNHEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------------------------------NNNNNNNNNNNNNNNNNN/aNNNNNNNNNNNNNNNNNNNNN!X1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; !NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLNNNNNNNNNNNNNNNNNNߨNNNNNNNNNNNNNNNNNNNNNNHL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;------------------------------------------------------------------!:NNNNNNNNNNNNNNNNNN0cNNNNNNNNNNNNNNNNNNNNNNTHE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN 9sHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLD A,(IOBYTE) RET ;---------------------------------------------------------------------------- ; ; SLEEP COMMAND ; ;ABNNNNNNNNNNNNNNNNN$pNNNNNNNNNNNNNNNNNNNNN! BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1STNNNNNNNNNNNNNNNNNN*SNNNNNNNNNNNNNNNNNNNNNN------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECI[NNNNNNNNNNNNNNNNN0,NNNNNNNNNNNNNNNNNNNNNN JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁l; مwF㉲P퍻X&Ēa/͖i7Ԛq@ݞ{I梵S"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' LrNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNBREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; GNNNNNNNNNNNNNNNNNN+!!NNNNNNNNNNNNNNNNNNNNNN------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LD (HL),A XOR (HL) ;RESULT SHOULzNNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNN ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; NNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNN!T_ADDR> ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPO3$NNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LDWNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNE DEVICE. ; ; I ; ;---------------------------------------------------------------------------- INPT: CALL EXiHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 1ST BYTE ADDR. ; ; M ; ;------------------------------------------------------XNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUSER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT NNNNNNNNNNNNNNNNNN&W}NNNNNNNNNNNNNNNNNNNNNNF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR [,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPT˒NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!PR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE '(aNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN---------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;----------------̭NNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNUNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTNNNNNNNNNNNNNNNNNN'dLNNNNNNNNNNNNNNNNNNNNNN RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTFNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNND E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;--NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIONAL BP2. ; ;---------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR W+gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET INNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNN!RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG ::&NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;- NNNNNNNNNNNNNNNNN(trNNNNNNNNNNNNNNNNNNNNN!PUT ADDR CALL Z,LADRB JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST ChNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNRLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;---------------------------------------------------------------------3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTR$NNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION A NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR AwNNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNN> ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: \*NNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON BNNNNNNNNNNNNNNNNNN)GCNNNNNNNNNNNNNNNNNNNNNNOMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST ANNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. TH&BNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNOL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BNNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNNDD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;CNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!DD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;-------------------------------------------------------------.rNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNNBC OUT (C),E RET ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; TJ?oNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNCALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-----------eNNNNNNNNNNNNNNNNN$1NNNNNNNNNNNNNNNNNNNNNNNEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THONNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;---------------------------------------NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁh7ՅrAމ{J獵R!𑿒\*Ȗd2Ϛl; ؞uCࢯ~LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;---------------------------------------------------BNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNN! NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN REHNNNNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNNLD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN********************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBINNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN*********************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;**************lNNNNNNNNNNNNNNNNNN%5NNNNNNNNNNNNNNNNNNNNNN**************** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CKNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN RET Z CCF ;ELSE RETURN NC RET ;**************************************************************************** ; ; REdNNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNN------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET ZNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNN!TURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;********************************Lq9NNNNNNNNNNNNNNNNN(CBNNNNNNNNNNNNNNNNNNNNNNA DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETdNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNBLER SOFTWARE AT START OF REST. ; ;**************************************************************************** REST: PUSH HLNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE 1dNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXTSjNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNN!ROUTINES ;**************************************************************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDEMdNNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNN!ALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;*************************************************************** ; a&dNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!* HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBCNNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN******************************* ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. NNNNNNNNNNNNNNNNN)psNNNNNNNNNNNNNNNNNNNNNNS THE CARRY FLAG. ; ;**************************************************************************** PCHK: CALL ECHO P2C: CP ' NNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNN! ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 B1NNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JRťNNNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNN! ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNR NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;*****&NNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;****************************tNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN A,H RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DENNNNNNNNNNNNNNNNN$/NNNNNNNNNNNNNNNNNNNNNNIF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;***********************************************MNNNNNNNNNNNNNNNNNNN*% NNNNNNNNNNNNNNNNNNNNNN' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF NNNNNNNNNNNNNNNNNN0ɘNNNNNNNNNNNNNNNNNNNNNNYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ ފrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρm; څxF㉲O썺W&Ē`.̖h6Ӛp? ܞyH墴Q NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNN!RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,NNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HlNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN-------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD )NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET8NNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP 2dNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN******************************* ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;******************************************************************** ; lNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC {NNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN!L) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. L9NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN!IGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH VnNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN JP WSVEC ;**************************************************************************** ; ; QUERY ROUTINE WILL TELL THE OPEoNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN ;******************************************************************** ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF TH"rNNNNNNNNNNNNNNNNN fNNNNNNNNNNNNNNNNNNNNNN INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;*************************************************************** ; ; EXLNNNNNNNNNNNNNNNNNN&̡NNNNNNNNNNNNNNNNNNNNN!NE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*************************************************************** LL.NNNNNNNNNNNNNNNNN,#jNNNNNNNNNNNNNNNNNNNNNN; CONSOLE OUTPUT ; ENTRY- (IOBYTE BIT 0..1): 0: TTY, 1: CRT, 2: BAT, 3: USR1 ; C= CHAR ; ;*********************************NNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNA,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 !NNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNND (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH NNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNCAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BQNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNRATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ONyNNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNNE PARITY BIT. ; ;******************************************************************** CONI: CALL CI AND 7FH RTS: RET WNNNNNNNNNNNNNNNNNN!U6NNNNNNNNNNNNNNNNNNNNNNF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;*************************************4rNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CNNNNNNNNNNNNNNNNN-[NNNNNNNNNNNNNNNNNNNNN!*********************************** CO: LD A,(IOBYTE) AND 3 JP Z,TTYOUT ;SYSTEM CONSOLE CP 2 JP M,CRTOUT ;CRT JP NZ,CNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNRS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC L$NNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNNAF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;FfNNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNE RESET TO THE DEFAULT ASSIGNMENT. ; ;---------------------------------------------------------------------------- IOER: LD A/NNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN ENTRY. ; ;**************************************************************************** QUERY: LD A,(IOBYTE) LD B,4 LD HLINNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO TBNNNNNNNNNNNNNNNNN"eNNNNNNNNNNNNNNNNNNNNNN************************** EXLF: CALL EXPR POP DE POP HL ;************************************************************_NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!ONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVrNNNNNNNNNNNNNNNNNN.ENNNNNNNNNNNNNNNNNNNNNNUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUT *** ;******************************************************************frNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!D C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INkNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' 7NNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNN,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;------------------------------------------- ; ; UNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALLr NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!HE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (PNNNNNNNNNNNNNNNNNNN#3TNNNNNNNNNNNNNNNNNNNNNN*** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************NNNNNNNNNNNNNNNNN)ܟNNNNNNNNNNNNNNNNNNNNN!ICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO NNNNNNNNNNNNNNNNNN/v9NNNNNNNNNNNNNNNNNNNNN!******* ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; C= CHAR ; ;*********** UNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX (NNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNN!EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;--------------qNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- RSTER: LD HL,RSTMSG ;-------------------NNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;**************************************************************************** PnNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;********************************NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPi.NNNNNNNNNNNNNNNNNN0etNNNNNNNNNNNNNNNNNNNNNN************************************************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,TTYOUT ;SYSTEM CONSOLE CP uBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNˁi8օtC~MꍸU#^,ɖf4Қp? ܞyG䢳PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNN80H JP M,CRTOUT ;CRT JP Z,LPRT ;LINE PRINTER JP LUSE1 ;USER 1 ;****************************************************y"NNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN****************************** ; ; CONSOLE INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USR1 ; EXIT - A= CgnNNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNER 2 ;************************************************************************* ; ; LIST DEVICE STATUS INPUT ; ENTRY- (IgNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN JP M,HSP ;HIGH SPEED PUNCH JP Z,PUSO1 ;USER 1 JP PUSO2 ;USER 2 SUBTTL PRIMITIVE I/O DRIVERS ;*********************"NNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN************** CRTIN: CALL CRTST ;IF NOT READY THEN WAIT JR Z,CRTIN IN A,BZUDAT ;INPUT CHAR RET CRTOUT: CALL CRPGHNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNNTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LPRST: IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERnNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNADER DEVICE (UR1) ; ;************************************** RUSI1: EQU IOER RUST1: EQU IOER ;****************************sNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN;************************************** PUSO2: EQU IOER ;************************************** ; ; ALTERNATE LIST DEVIC8NNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN********************* ; ; CONSOLE STATUS INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USER 1 ; EXIT - A= 0_HNNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNHAR (CTRL-Z: EOF) ; ;******************************************************************** CI: LD A,(IOBYTE) AND 3 JP Z,TT>NNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNOBYTE BIT 6..7)= 0:TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; EXIT - A= 0: BUSY, FFH: READY ; ;************************************\[NNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN***************** ; ; PRIMARY CONSOLE DEVICE (TTY) ; ;************************************** TTYIN: CALL TTST ;IF CHAR NXNNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNTOST ;IF NOT READY THEN WAIT JR Z,CRTOUT LD A,C ;OUTPUT CHAR OUT BZUDAT,A RET CRTST: IN A,BZUST ;IF RXRDY NOT TRNNNNNNNNNNNNNNNNNN Q7NNNNNNNNNNNNNNNNNNNNNNSE SENSE AND A,[1 SHL CENTBSY] RET Z LD A,-1 ;ELSE RETURN -1 RET ; ADDITIONAL I/O DEVICES ;********************vNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN********** ; ; ALTERNATE READER DEVICE (UR2) ; ;************************************** RUSI2: EQU IOER RUST2: EQU IOER ! NNNNNNNNNNNNNNNNN,ZNNNNNNNNNNNNNNNNNNNNNNE (UL1) ; ;************************************** LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTRSINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTS: LD A,(IOBYTE)yNNNNNNNNNNNNNNNNN INNNNNNNNNNNNNNNNNNNNNNYIN ;SYSTEM CONSOLE CP 2 JP M,CRTIN ;CRT JP NZ,CUSI1 ;USER 1 ; BATCH INPUT FALLS INTO READER VECTOR ;*************#hBNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,TTOST ;SYSTEM CONSOLE CP 80H JP M,CRTOST ;CRTNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNN!OT READY THEN WAIT JR Z,TTYIN IN A,NTD ;ELSE RETURN CHAR RET TTYOUT: CALL TTOST ;IF NOT READY TO ACCEPT CHAR THEN WЫNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNNUE THEN RETURN 0 AND BZURXR CRTST1: RET Z LD A,-1 ;ELSE RETURN -1 RET CRTOST: IN A,BZUST ;IF TXRDY NOT TRUE THEN RpNNNNNNNNNNNNNNNNNN!bNNNNNNNNNNNNNNNNNNNNNN****************** ; ; ALTERNATE CONSOLE DEVICE (UC1) ; ;************************************** CUSI1: EQU IOER CUSO1: EQUpyNNNNNNNNNNNNNNNNNN'ȠNNNNNNNNNNNNNNNNNNNNNN ;************************************** ; ; PRIMARY PUNCH DEVICE (TTY) ; ;************************************** TTPNCH: zgNNNNNNNNNNNNNNNNNN-'kNNNNNNNNNNNNNNNNNNNNNNMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'Z`HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,CRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE STATUS INPUT FALLS THROUG|NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN******************************************************* ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)= 0: TTY, 4: PTR, 8: USR1,=NNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNN! JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 ;*************************************************************************9zNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN OUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR NOT READY THEN RETURN 0 !NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNETURN 0 AND BZUTXR JR CRTST1 ;************************************** ; ; ALTERNATE LIST DEVICE (LPT) ; ;***********`6NNNNNNNNNNNNNNNNNN"7UNNNNNNNNNNNNNNNNNNNNNN IOER CUST1: EQU IOER ;************************************** ; ; PRIMARY READER DEVICE (TTY) ; ;*********************TNNNNNNNNNNNNNNNNN(؞NNNNNNNNNNNNNNNNNNNNNNEQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;************************************NNNNNNNNNNNNNNNNNN.r8NNNNNNNNNNNNNNNNNNNNNNMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;***************************************************** ; ; TBLNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!H HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH JP Z,TTST ;SYSTEM CONNmNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNN CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;******************************************************************** RI:gHNNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CHAR ; ;****************NNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNAND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETURN 0 CPL AND 1 SHL NNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!*************************** LPRT: CALL LPRST ;IF BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HۥNNNNNNNNNNNNNNNNNN#dNNNNNNNNNNNNNNNNNNNNNN***************** TTYRDR: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (PTR) ; ;******'NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN** HSP: EQU IOER HSPST: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (UP1) ; ;**********NNNNNNNNNNNNNNNNNN/A NNNNNNNNNNNNNNNNNNNNNN CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;****************************j]NNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNSOLE CP 8 JP M,PTRST ;PAPER TAPE RDR JP Z,RUST1 ;USER 1 JP RUST2 ;USER 2 ;**************************************yNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD A,(IOBYTE) AND 0CH JP Z,TTYRDR ;SYSTEM CONSOLE CP 8 JP M,PTRIN ;PAPER APE RDR JP Z,RUSI1 ;USER 1 JP RUSI2 ;USBNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN********************************************************* PUNO: LD A,(IOBYTE) AND 30H JP Z,TTPNCH ;SYSTEM CONSOLE CP 20H FNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNTBSY JR TTOST1 ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CRT) ; ;************************qNNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNN!IGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CEL*NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN******************************** PTRIN: EQU IOER PTRST: EQU IOER ;************************************** ; ; ALTERNATE REʦNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN**************************** PUSO1: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (UP2) ; ;NNNNNNNNNNNNNNNNNN0RDNNNNNNNNNNNNNNNNNNNNNN************************* TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNρl; مxF㉲PY(ƒd2ϖm< ۚxG垴R!𢿣],NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%dNNNNNNNNNNNNNNNNNNNNNN DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P K!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DB '1' ; USER DEVICE #1 DB 'P' ; READER TO HIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSOLE ; ACT: DB 'C' ;LOG?NNNNNNNNNNNNNNNNNN ` NNNNNNNNNNNNNNNNNNNNNNLPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END NNNNNNNNNNNNNNNNN@uNNNNNNNNNNNNNNNNNNNNNN********************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.2 - 18 JUL 82, Move DD to hi@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!king the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command source disk opӫNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNn Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 GRH ; Fix bug i/vpNNNNNNNNNNNNNNNNNN%FNNNNNNNNNNNNNNNNNNNNNN************************************************* SUBTTL DECLARATIONS ;====================================================6 NNNNNNNNNNNNNNNNNN+INNNNNNNNNNNNNNNNNNNNNNNROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCVjnNNNNNNNNNNNNNNNNNNp7NNNNNNNNNNNNNNNNNNNNNN DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y bLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'C' ; CONSOLE TO CRT D$ NNNNNNNNNNNNNNNNNN5ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNgh memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in case the 1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNtion. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allow boot from 2nd:wNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNn ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT]NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN======================== ; ; CONSTANTS ; ;============================================================================ FNNNNNNNNNNNNNNNNNN,UNNNNNNNNNNNNNNNNNNNNNNLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;============================================================================ LIST OFqNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLEyNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!B 'T' ; CONSOLE TO SYSTEM CONSOLE ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;-----------------xdNNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNhead is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 GRH ; Fix bug in recal routin- NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 ; 72 D DRIVE 1 HEANNNNNNNNNNNNNNNNNN!#NNNNNNNNNNNNNNNNNNNNNN' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; Modify floppy bo0NNNNNNNNNNNNNNNNNN'$NNNNNNNNNNNNNNNNNNNNN!ALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 NNNNNNNNNNNNNNNNNN-fNNNNNNNNNNNNNNNNNNNNN!F *INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.CPNNNNNNNNNNNNNNNNNNڑNNNNNNNNNNNNNNNNNNNNNN DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'T' ; LIST TO SYSTEM CONtNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN---------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC zTNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!e to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GRH ; Fix bug iONNNNNNNNNNNNNNNNNNPKNNNNNNNNNNNNNNNNNNNNNND 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver functions & vector1NNNNNNNNNNNNNNNNNN"vNNNNNNNNNNNNNNNNNNNNNNot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). ; ; 3.NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAU5NNNNNNNNNNNNNNNNNNN.3NNNNNNNNNNNNNNNNNNNNNNDEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON PHASECK MACRO #NAME IF $ <> #NAME CONMSG **** Phase Error - #NAME ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; PUNCH TO "NNNNNNNNNNNNNNNNNNN ʯNNNNNNNNNNNNNNNNNNNNNN DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS 1fNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN! TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNn boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 is ; generatingцNNNNNNNNNNNNNNNNNNczNNNNNNNNNNNNNNNNNNNNNNs and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the following logicalNNNNNNNNNNNNNNNNNN#ENNNNNNNNNNNNNNNNNNNNNN04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ; ; 3 NNNNNNNNNNNNNNNNNN)+NNNNNNNNNNNNNNNNNNNNNNLT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF RNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNNot Equal to *ROM.DEF **** ENDIF ENDM SUBTTL UNINITIALIZED DATA ;####################################################+>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOLE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '2' ; USER DEVICE #2 vyNNNNNNNNNNNNNNNNNN S8NNNNNNNNNNNNNNNNNNNNNN; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',^HNNNNNNNNNNNNNNNNNNsDNNNNNNNNNNNNNNNNNNNNN! ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;******************************************************INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the request thus ; yan NNNNNNNNNNNNNNNNNN6)NNNNNNNNNNNNNNNNNNNNNN to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 8" MicromatioNNNNNNNNNNNNNNNNNN$wNNNNNNNNNNNNNNNNNNNNN!.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; VERSN EQU 305 ; ;***************************]NNNNNNNNNNNNNNNNNN*xNNNNNNNNNNNNNNNNNNNNNNTHIS PROM FOR CODE CHECKING ;============================================================================ ; ;*INCLUDE ZMO NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN######################## ; ; PAGE 0 RESERVED AREA ; ;#####################################################################ܶNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNˁi8ׅuD≱O퍼Z*Ȓf5ԖrAN잻Y(ƣd3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNN!####### ORG 0040H ; ; BOOT VARIABLES ; PHASECK ?DKPROM DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LUNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK ?DKF_)NNNNNNNNNNNNNNNNNN W9NNNNNNNNNNNNNNNNNNNNNN ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;--------------------------------------------------------------~NNNNNNNNNNNNNNNNNNwENNNNNNNNNNNNNNNNNNNNNNARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOP!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,14H ;NNNNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;+++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNN%vNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,DD_PORT8 IN AfANNNNNNNNNNNNNNNNNN+yNNNNNNNNNNNNNNNNNNNNNN SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,86H JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + FxNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;------------------------------------------j[NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNUNC JP DKFUNC ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; O~NNNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNN-------------- COLD: DI ;DISABLE ROM IMAGE OUT (?COLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPY ; C..F = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; ;---------------------------------------------%ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;----------------------------------NNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++|NNNNNNNNNNNNNNNNNN&%NNNNNNNNNNNNNNNNNNNNNN,(C) AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCESSOR ; LD A,DD_BGNNNNNNNNNNNNNNNNNN,bNNNNNNNNNNNNNNNNNNNNNNBD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER \NNNNNNNNNNNNNNNNNNt6NNNNNNNNNNNNNNNNNNNNNN---------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;---------------------------------------------------------NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNENTRY- C= CHAR ; ;**************************************************************************** JP CO ;+++++++++++++++++NNNNNNNNNNNNNNNNNN1[NNNNNNNNNNNNNNNNNNNNN! JR BEGIN ;---------------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLEX|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------------------- BEGIN: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (?DKPROM),A ; ; EXTRACT DRIVL^~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------------------------------ ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;--------kNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNN CALL JWAIT JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR NNNNNNNNNNNNNNNNNN-QNNNNNNNNNNNNNNNNNNNNN! ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------- PHASECK ?DKCOLD JP COLD ;BOOT VECTOR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN ήNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT ?NNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNR ; ;---------------------------------------------------------------------------- DS ?XOVER - $ ;POSITION CODE DKRET: LD AiNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,>NNNNNNNNNNNNNNNNNNg{NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET jNNNNNNNNNNNNNNNNNN"ANNNNNNNNNNNNNNNNNNNNNN+++++++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN(*NNNNNNNNNNNNNNNNNNNNNN ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,2 ;SET NNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PB_SECO) ;NEXT SECTONNNNNNNNNNNNNNNNNNސNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN- AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECdNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN,?XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (?ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA JR NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (?DKPROM + 1),A ; ; NOW VEC NNNNNNNNNNNNNNNNNNTJNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+++++++++ 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THENNNNNNNNNNNNNNNNNNN .˻NNNNNNNNNNNNNNNNNNNNNN SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERR"NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! RANGE THEN RETURN ERROR JP NC,JSELERR ; LD HL,DRVPRT ;CALULATE DRIVE PORT TABLE ELEMENT ADD A,L LD L,A LD A,0 ADC NNNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C'= CONTROLLER PORT ADDRESS ; EXIT - a NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THENNNNNNNNNNNNNNNNNNN tNNNNNNNNNNNNNNNNNNNNNNYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SEND SECTOR DATA DW JTYPE2 ;FORMAT TRACK " " " DW JTYPE1 ;READ NNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNN!********************* DCMDERR: LD (IX + PB_STATO),PB_ILCMD ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET 'NNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++5NNNNNNNNNNNNNNNNNN )R,NNNNNNNNNNNNNNNNNNNNN! XFER DATA ; OR A,C JR Z,JT1 ; LDIR ; ; REMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXXNNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNNORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WIN!NNNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNNA,H LD H,A LD A,(HL) ;FETCH CONTROLLER PORT EXX LD C,A EXX ; CP A,?HSTATUS ;IF HARD DISK THEN EXIT JP Z,ISHAX ;NNNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNNAF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ƒNNNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNN NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HARD DISK CP A,4 ;IF 5" THEN OK JR C,JADEOK ; SUB A,8 ;SKIP OVER MICCNNNNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNN!ADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTPUT IOPB ONLY DW JTYPE4 ;EIA STATUS " " DW JTYPE4 ;IDLE " " DW JTYPNNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNN!;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; ;***************NNNNNNNNNNNNNNNNNN $$pNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF 'NNNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNN! ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PB_STATO),PB_B@@NNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNN!DOW TO SECTOR BUFFER ; EXX LD A,DD_MB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNˁi8օsB~M荷U%Ē_.̖j:֚uD➯}K颸V$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNN POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD NNNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNNOPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO CDB ; PUSH HL EXX POP HL LD DE,DD_CBO ADNNNNNNNNNNNNNNNNNN  >NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; NNNNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNNN; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNNNMMAND TO OUTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNN ENDIF SUBTTL MICROMATION PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICbNNNNNNNNNNNNNNNNNN % qNNNNNNNNNNNNNNNNNNNNNNis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Rel$NNNNNNNNNNNNNNNN +~NNNNNNNNNNNNNNNNNNNNNNt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE INNNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNND HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,QNNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNN COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL LD DE,DD_CBO + PB_STATO ADD HL,DE ; ; FETCH IOPB ADDRESS OFyNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; y7NNNNNNNNNNNNNNNNNN 5NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FHNNNNNNNNNNNNNNNNNNN  ߄NNNNNNNNNNNNNNNNNNNNNNROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL NNNNNNNNNNNNNNNNNN &u"NNNNNNNNNNNNNNNNNNNNN!ease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,BNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNNot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi`'NNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNNNF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT2 ; LDIR ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++]yNNNNNNNNNNNNNNNNNN  cNNNNNNNNNNNNNNNNNNNNNNPB_STATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR CgNNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNN STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,PB_STATO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SpNNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNN TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLENNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!OR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMPNNNNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNN! TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMNNNNNNNNNNNNNNNNNN 'FNNNNNNNNNNNNNNNNNNNNNNning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to uNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNNnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8[6NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOvNNNNNNNNNNNNNNNNNN  6NNNNNNNNNNNNNNNNNNNNNNOMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++~NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIZE - PB_STATO ; ; UPLOAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHNNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNNR PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|NNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNNOUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THENNNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************eNNNNNNNNNNNNNNNNNNN (V-NNNNNNNNNNNNNNNNNNNNNNboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNN6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore rNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNNPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++Y~NNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++fNNNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNN++++ JTYPE5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;++++++++NNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DD_SHLT JR NZ,JWAIT1 SMNNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brGNNNNNNNNNNNNNNNN )eNNNNNNNNNNNNNNNNNNNNN!e status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@ NNNNNNNNNNNNNNNNN /ϺNNNNNNNNNNNNNNNNNNNNNNoutine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; KRNNNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DD_MB0 ;ONNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++/NNNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNN+++++++++ ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR iNNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COBNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** LXBNNNNNNNNNNNNNNNNNN $@NNNNNNNNNNNNNNNNNNNNNNeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVt NNNNNNNNNNNNNNNNN *0ONNNNNNNNNNNNNNNNNNNNNN2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#NNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNVERSN EQU '10' ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT ( $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁j7ԅo> ىvDލzH味O땸T#񙾚[)Ğ`-ɢd1ϦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN!FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZNNNNNNNNNNNNNNNNN!qNNNNNNNNNNNNNNNNNNNNNN========================= IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; SPSV EQU 6 ;STACKNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNNLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS UNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; NNNNNNNNNNNNNNNN!! NNNNNNNNNNNNNNNNNNNNNN; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF gNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNREGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTEINNNNNNNNNNNNNNNN!%aNNNNNNNNNNNNNNNNNNNNNNR WINIT ;GO TO MONITOR EXEC ;**************************************************************************** ; ; MEMSIZ SUBNNNNNNNNNNNNNNNN!+BNNNNNNNNNNNNNNNNNNNNN!****************************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORYNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF D'NNNNNNNNNNNNNNNNNN!ONNNNNNNNNNNNNNNNNNNNNN PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLZ'NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF-:INNNNNNNNNNNNNNNN!WQNNNNNNNNNNNNNNNNNNNNNNREMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS P%NNNNNNNNNNNNNNNNN!t^NNNNNNNNNNNNNNNNNNNNNN< 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPA`NNNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNNNTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTEo3NNNNNNNNNNNNNNNNN!&4NNNNNNNNNNNNNNNNNNNNNNR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FXdNNNNNNNNNNNNNNNN!,mNNNNNNNNNNNNNNNNNNNNNN (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;****************4NNNNNNNNNNNNNNNN!͵NNNNNNNNNNNNNNNNNNNNNN *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; x0BNNNNNNNNNNNNNNNN! "~NNNNNNNNNNNNNNNNNNNNN!OC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOC_3NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATU'NNNNNNNNNNNNNNNN!d`NNNNNNNNNNNNNNNNNNNNNN LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,i-NNNNNNNNNNNNNNNNN!GoNNNNNNNNNNNNNNNNNNNNN!CE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF tNNNNNNNNNNNNNNNNN!!1NNNNNNNNNNNNNNNNNNNNNN OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O 9NNNNNNNNNNNNNNNNN!'NNNNNNNNNNNNNNNNNNNNNNOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;******************************************************************B$!NNNNNNNNNNNNNNN!-\NNNNNNNNNNNNNNNNNNNNNN************************************************************ MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFNNNNNNNNNNNNNNNNN!T"NNNNNNNNNNNNNNNNNNNNNN ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WAb'NNNNNNNNNNNNNNNNN! w-NNNNNNNNNNNNNNNNNNNNNNX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPL]yNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT T dNNNNNNNNNNNNNNNN!13NNNNNNNNNNNNNNNNNNNNNN80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H=NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNPOP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL /NNNNNNNNNNNNNNNN!"bNNNNNNNNNNNNNNNNNNNNNNINIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK LNNNNNNNNNNNNNNNNNN!(NNNNNNNNNNNNNNNNNNNNNN********** MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (NNNNNNNNNNNNNNNNN!.NNNNNNNNNNNNNNNNNNNNNNF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF b3aNNNNNNNNNNNNNNN!gNNNNNNNNNNNNNNNNNNNNNNRM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;=======================-yNNNNNNNNNNNNNNNN! DNNNNNNNNNNNNNNNNNNNNNNOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;------------------------------------7NNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNHE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP xNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN!),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LDNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 $NNNNNNNNNNNNNNNN!#SNNNNNNNNNNNNNNNNNNNNNNBOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DI=NNNNNNNNNNNNNNNN!)$NNNNNNNNNNNNNNNNNNNNNNHL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORNNNNNNNNNNNNNNNNN!/>NNNNNNNNNNNNNNNNNNNNNNSUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** NNNNNNNNNNNNNNNN!2@NNNNNNNNNNNNNNNNNNNNNN===== CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;===ҝNNNNNNNNNNNNNNNNN! ݋NNNNNNNNNNNNNNNNNNNNNN-- ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSO`^NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE1BNNNNNNNNNNNNNNNNN! 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,?$NNNNNNNNNNNNNNNNN!CnNNNNNNNNNNNNNNNNNNNNN!UE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;--------~ NNNNNNNNNNNNNNNNN! 0NNNNNNNNNNNNNNNNNNNNNNSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUNNNNNNNNNNNNNNNNN!&NNNNNNNNNNNNNNNNNNNNNNLL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;------------------------------------THNNNNNNNNNNNNNNNN!,]NNNNNNNNNNNNNNNNNNNNNN PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BCì!NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNHE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF NNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNN!EN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;------------------------------u#NNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN!----------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TAJNNNNNNNNNNNNNNNN!SPNNNNNNNNNNNNNNNNNNNNNNA LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LrNNNNNNNNNNNNNNNN!p_NNNNNNNNNNNNNNNNNNNNNN-------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 Q*NNNNNNNNNNNNNNNNN!!NNNNNNNNNNNNNNNNNNNNNNE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;----v NNNNNNNNNNNNNNNNNN!'0NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH%HNNNNNNNNNNNNNNNN!-lNNNNNNNNNNNNNNNNNNNNNN CALL HILOXB JR CMPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY C9NNNNNNNNNNNNNNNN!cNNNNNNNNNNNNNNNNNNNNNNTHE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;**************************************************NNNNNNNNNNNNNNNN! @NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE AabINNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNBLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNND H,(HL) LD L,A JP (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY C^BNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;9dNNNNNNNNNNNNNNNN!"RNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------ ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PRdNNNNNNNNNNNNNNNNN!( NNNNNNNNNNNNNNNNNNNNN! OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITNNNNNNNNNNNNNNNNN!.?NNNNNNNNNNNNNNNNNNNNNNOMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSENNNNNNNNNNNNNNNN!P#NNNNNNNNNNNNNNNNNNNNNN************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMSNNNNNNNNNNNNNNNNN! s,NNNNNNNNNNNNNNNNNNNNNNSSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4NNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;-------------------q'NNNNNNNNNNNNNNNNN!52NNNNNNNNNNNNNNNNNNNNNNOMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE NNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNSAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS 2NNNNNNNNNNNNNNNNN!#cNNNNNNNNNNNNNNNNNNNNNNEVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTNNNNNNNNNNNNNNNNN!)NNNNNNNNNNNNNNNNNNNNNNH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---------------------+NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;**********gdNNNNNNNNNNNNNNNN!$eNNNNNNNNNNNNNNNNNNNNNNERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;------- NNNNNNNNNNNNNNNNN!*FNNNNNNNNNNNNNNNNNNNNNNF_VERIFY_BLOCK> ; ;---------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,. NNNNNNNNNNNNNNNNNN!0CNNNNNNNNNNNNNNNNNNNNNNME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;---------------------------------------------------------[BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁j8ԅq? ډvDލ|H摴P땸R!Y'Þ^+Ǣb0ͦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"0 NNNNNNNNNNNNNNNNNNNNNN------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNSTART ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A BNNNNNNNNNNNNNNNN" ufNNNNNNNNNNNNNNNNNNNNNNOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;--------------;HNNNNNNNNNNNNNNNNN"UNNNNNNNNNNNNNNNNNNNNNNSP ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POPPNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNRT BREAKPOINT VECTOR TO RST 8 ; LD HL,REST LD (9),HL ;SET BP VECTOR ADDR ; ; RESTORE ROUTINE IS ON STACK, SO COMPUTE E*NNNNNNNNNNNNNNNNNN"wNNNNNNNNNNNNNNNNNNNNNN ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;------ NNNNNNNNNNNNNNNN"%)NNNNNNNNNNNNNNNNNNNNNN-- ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ;aNNNNNNNNNNNNNNNN"+&NNNNNNNNNNNNNNNNNNNNNNTO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-------------------------------NNNNNNNNNNNNNNNNN"eXNNNNNNNNNNNNNNNNNNNNN!DARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN! ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;--------------------------------NNNNNNNNNNNNNNNN" 5NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PC5 NNNNNNNNNNNNNNNN"̍NNNNNNNNNNNNNNNNNNNNNN HL ;SPTR ; LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 ; LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL ;4NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNNTRY ADDRESS ; LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP ; ; EXECUTE THE RESTORE & GOTO ; POP DE ;ADJUST STACKNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNN-------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;-----SHNNNNNNNNNNNNNNNNN"&zNNNNNNNNNNNNNNNNNNNNN! PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUNNNNNNNNNNNNNNNN",@NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A, !NNNNNNNNNNNNNNNN"ViNNNNNNNNNNNNNNNNNNNNNNTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RJ&NNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT AiNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNHK ;SEE IF OD ADDR WANTED JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ;YES, BUT SET BP ; ; FENNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL ; LD A,0CFH ;INSERT THE BP LD (DE),A ; ; IF NO MORE ARGS nNNNNNNNNNNNNNNNNN"ܳNNNNNNNNNNNNNNNNNNNNNN JP (HL) ;GO DO REG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FR NNNNNNNNNNNNNNNNNN"!6NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETENNNNNNNNNNNNNNNNN"'KNNNNNNNNNNNNNNNNNNNNNNT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-----------------------------------------ɀNNNNNNNNNNNNNNN"-sNNNNNNNNNNNNNNNNNNNNNN(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAJNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND yNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNNLLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS NNNNNNNNNNNNNNNNN"INNNNNNNNNNNNNNNNNNNNNNTCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION KNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNTHEN DONE WITH BREAKPOINTS ; GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 ; ; IF MORE ALLOWED THNNNNNNNNNNNNNNNN"E$NNNNNNNNNNNNNNNNNNNNNNOM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT STWyNNNNNNNNNNNNNNNNN"3xNNNNNNNNNNNNNNNNNNNNNN ADD HL,SP LD (HL),D DEC HL LD (HL),E ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF LAST = CR THEN EXIT VNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNEN CONTINUE ; DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;NEW LINE FOR PfvHNNNNNNNNNNNNNNNN"vNNNNNNNNNNNNNNNNNNNNNN> ; ;---------------------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C NNNNNNNNNNNNNNNNNN"#PNNNNNNNNNNNNNNNNNNNNN!T_ADDR> ; ;---------------------------------------------------------------------------- MOVE: NNNNNNNNNNNNNNNN")DNNNNNNNNNNNNNNNNNNNNNNATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE,ȮNNNNNNNNNNNNNNNNN"/NNNNNNNNNNNNNNNNNNNNN!E ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = P!NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNCONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO oNNNNNNNNNNNNNNNN" FWNNNNNNNNNNNNNNNNNNNNNNART_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPzbNNNNNNNNNNNNNNNN"f+NNNNNNNNNNNNNNNNNNNNN! CP CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNGM ; POP HL ;GET RID OF STACK JUNK ; ; PASS IN LOCATION OF RESTORE ROUTINE ; LD HL,RS9 PUSH HL ; ; INSERT RESTAgeNNNNNNNNNNNNNNNN"#FNNNNNNNNNNNNNNNNNNNNNN CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE NNNNNNNNNNNNNNNN"$NNNNNNNNNNNNNNNNNNNNN!CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;----------------------------------------------NNNNNNNNNNNNNNNNN"*NNNNNNNNNNNNNNNNNNNNNN COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS t&NNNNNNNNNNNNNNNNNN"0NNNNNNNNNNNNNNNNNNNNNNTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNʁg5хm< ׉sAۍwEᑰ~M镶P왺W%]+Ǣb/̦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN";NNNNNNNNNNNNNNNNNNNNN!UB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCKGNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNJNZ BITS1 POP DE RET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERNNNNNNNNNNNNNNNN" BVNNNNNNNNNNNNNNNNNNNNNNL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THENNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;REC#$NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSECNNNNNNNNNNNNNNNNNN"زNNNNNNNNNNNNNNNNNNNNN!********************************************************* ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOu$NNNNNNNNNNNNNNNNN" 2NNNNNNNNNNNNNNNNNNNNNNCHAR IN A POP BC RET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAME NNNNNNNNNNNNNNNNN"&JNNNNNNNNNNNNNNNNNNNNNNHL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;************* NNNNNNNNNNNNNNNN",wNNNNNNNNNNNNNNNNNNNNN!* ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; nNNNNNNNNNNNNNNNN"aYNNNNNNNNNNNNNNNNNNNNNNMORY'S OPERATIVENESS. ; ; T ; ;---------------------------------------------------------------------BNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNNSIRED. ; ; 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 ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;---------------------------------------------------------------------------- XAA+gNNNNNNNNNNNNNNNNN"7yNNNNNNNNNNNNNNNNNNNNN!R, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; TҨ NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN 0{NNNNNNNNNNNNNNNN"rNNNNNNNNNNNNNNNNNNNNNN**************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40lNNNNNNNNNNNNNNNN""TNNNNNNNNNNNNNNNNNNNNNN***** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;******************************!NNNNNNNNNNNNNNNNN"(ENNNNNNNNNNNNNNNNNNNNNNOL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************NNNNNNNNNNNNNNNNN".NNNNNNNNNNNNNNNNNNNNNN'0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;*************NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADBNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNN: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 ONNNNNNNNNNNNNNNNNN"HNNNNNNNNNNNNNNNNNNNNNNHIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = C NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNEXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC3tNNNNNNNNNNNNNNNNN"A%NNNNNNNNNNNNNNNNNNNNNNH DAA LD C,A RET ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROYBNNNNNNNNNNNNNNNN"#gNNNNNNNNNNNNNNNNNNNNNN********************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUSNNNNNNNNNNNNNNNN")tNNNNNNNNNNNNNNNNNNNNN!************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HNNNNNNNNNNNNNNNNN"/"NNNNNNNNNNNNNNNNNNNNNN*************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT D"HNNNNNNNNNNNNNNNNN" qgNNNNNNNNNNNNNNNNNNNNNNF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HINNNNNNNNNNNNNNNN"QNNNNNNNNNNNNNNNNNNNNNNR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR !NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2rNNNNNNNNNNNNNNNN"vNNNNNNNNNNNNNNNNNNNNNNM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*********************************************************>9NNNNNNNNNNNNNNNN"$(NNNNNNNNNNNNNNNNNNNNNNND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGSHNNNNNNNNNNNNNNNNN"*'NNNNNNNNNNNNNNNNNNNNNNILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK )'NNNNNNNNNNNNNNNNNN"01NNNNNNNNNNNNNNNNNNNNNNKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION 9 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁i7Ӆo> ىvDߍ}J摵P땸R Y'ž^,Ƣb0ͦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#FNNNNNNNNNNNNNNNNNNNNN!IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;*******kNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN. ; ;**************************************************************************** REST: ; ; SAVE 8080 REGS FIRST SO WE CANNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNN IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT ; RS3: INC HL ;NOT NNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNNN SKIP RESTORE OR D JR Z,RS8 ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A ; RS8: INC HL ;DO NEXT BP DJNZ RSmNNNNNNNNNNNNNNNN#eNNNNNNNNNNNNNNNNNNNNN!----------------------------------------------------------------------- EXIT: ; ; FIRST RESTORE THE Z80 UNIQUES ; POP BC99NNNNNNNNNNNNNNNNN#fNNNNNNNNNNNNNNNNNNNNNN THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;--------------------------8NNNNNNNNNNNNNNNN#%NNNNNNNNNNNNNNNNNNNNNN- COMERR: CALL PRTWD JP WSVEC ;**************************************************************************** ; ; QUERY C NNNNNNNNNNNNNNNN#+NNNNNNNNNNNNNNNNNNNNNNT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONI ROUTINE READS TH{NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN********************************************************************* PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN NNNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNN!N WORK ; PUSH HL PUSH DE PUSH BC PUSH AF ; ; GET THE MONITOR STACK LOCATION ; CALL MEMSIZ ; ; SET UP PTR TO 1INNNNNNNNNNNNNNNN#VNNNNNNNNNNNNNNNNNNNNNNFOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ; RS4: INC BC ;NONE FOUND ; RS5: LD HL,LLOCX ; POP DE ADD HL,SP LD (H׌NNNNNNNNNNNNNNNN#9NNNNNNNNNNNNNNNNNNNNNN7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,HNNNNNNNNNNNNNNNNN#6NNNNNNNNNNNNNNNNNNNNNN LD A,C LD R,A LD A,B LD I,A POP IY POP IX POP AF POP BC POP DE POP HL ; ; NOW DO THE 8080 REGS ; EX $NNNNNNNNNNNNNNNNN# shNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR VNNNNNNNNNNNNNNNNN#&NNNNNNNNNNNNNNNNNNNNNNROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN NNNNNNNNNNNNNNNN#,6NNNNNNNNNNNNNNNNNNNNNNE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: CALL CI %!NNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NCEoNNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNREGISTER SAVE AREA ABOVE STACK ; EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP ; LD B,4 ;FOUR REGS EX DE,HL=NNNNNNNNNNNNNNNNNN#eNNNNNNNNNNNNNNNNNNNNN!L),E ;STORE USER (HL) INC HL LD (HL),D ; PUSH BC ; LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT ; POP DE ;BP 2hNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNA LD A,R LD C,A PUSH BC ; ; GOTO MONITOR ; JP WINITA ;RETURN TO MONITOR ;------------------------------------NNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNAF,AF' EXX POP DE POP BC POP AF POP HL ;STACK PTR LD SP,HL DB 0 ;'NOP' OR PLACE FOR 'EI' LD HL,0 ;'HL' REGISTiNNNNNNNNNNNNNNNNN#!@YNNNNNNNNNNNNNNNNNNNNNNCOMERR ;---------------------------------------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDϵNNNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNN A CR) ARE ; REQUIRED ON ENTRY. ; ;**************************************************************************** QUERY: LD A,FNNNNNNNNNNNNNNNNN#-4NNNNNNNNNNNNNNNNNNNNNN AND 7FH RTS: RET ;**************************************************************************** ; ; PRTWD ROUTINE OUTPU*rNNNNNNNNNNNNNNNN#JNNNNNNNNNNNNNNNNNNNNN! RET ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REPBNNNNNNNNNNNNNNNN# ENNNNNNNNNNNNNNNNNNNNN! ; ; SAVE AF,BC,DE,HL ; RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 ; ; FETCH1NNNNNNNNNNNNNNNNN#vNNNNNNNNNNNNNNNNNNNNNNLOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 ; INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD ({NNNNNNNNNNNNNNNN#[NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; THE FOLLOWING CODE IS MOVED TO THE MONITOR STACK AREA ; ;--------------------A0yNNNNNNNNNNNNNNNN#3NNNNNNNNNNNNNNNNNNNNN!ER JP 0 ;'PC' REGISTER ; ENDX: EQU $ ;---------------------------------------------------------------------------- ; NNNNNNNNNNNNNNNN#" NNNNNNNNNNNNNNNNNNNNNNLER ; ;---------------------------------------------------------------------------- RSTER: PUSH AF PUSH HL LD HL,RSTMSG ONNNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNNN(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LdNNNNNNNNNNNNNNNNN#.PgNNNNNNNNNNNNNNNNNNNNNNTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRINNNNNNNNNNNNNNNNN#{NNNNNNNNNNNNNNNNNNNNN!GISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FORHNNNNNNNNNNNNNNNNN# tNNNNNNNNNNNNNNNNNNNNNN RETURN ADDRESS FROM PGM STACK ; POP BC ;GET BREAKPOINT LOCATION + 1 ; DEC BC ;BACK UP TO RESTART INSTRUCTION ; LD SP3NNNNNNNNNNNNNNNNNN#ENNNNNNNNNNNNNNNNNNNNNNHL),D ; EX DE,HL ;OUTPUT BP LOCATION CALL LADR ; RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 ; RS7: LD E,(HL) ;NNNNNNNNNNNNNNNNN#jNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------- RS9: PUSH HL RST 8 ;FORCE BP ; ;---------------------------------NNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULK$NNNNNNNNNNNNNNNNN##&;NNNNNNNNNNNNNNNNNNNNNN CALL PRTWD POP HL POP AF JP REST ;---------------------------------------------------------------------------- ; ;mwNNNNNNNNNNNNNNNNN#)NNNNNNNNNNNNNNNNNNNNNNOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ONNNNNNNNNNNNNNNNN#/cVNNNNNNNNNNNNNNNNNNNNNNG WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;*******************************************************^NNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNN! LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF RESTBNNNNNNNNNNNNNNNN# 0NNNNNNNNNNNNNNNNNNNNN!,HL ;SET THE MONITOR STACK ; LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE ; LD D,NBKPTS ; RS2: LD A,(HL) SUB C ;SEE@rNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THENZNNNNNNNNNNNNNNNNNN#TNNNNNNNNNNNNNNNNNNNNNN------------------------------------------- ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTES THE 'PC' ; ;-----,4NNNNNNNNNNNNNNNN#UNNNNNNNNNNNNNNNNNNNNNNAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OFINNNNNNNNNNNNNNNN#$NNNNNNNNNNNNNNNNNNNNNN COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;----------------------------------------------------------------------------gNNNNNNNNNNNNNNNNN#*NNNNNNNNNNNNNNNNNNNNN!N CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,DE ;NEXNNNNNNNNNNNNNNNNNN#0pNNNNNNNNNNNNNNNNNNNNNN********************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNʁf5хn= ׉sA܍wDᑯ{J整O왹V$򝿞Z'â^+ȦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#qNNNNNNNNNNNNNNNNNNNNNN ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;************************************************%9NNNNNNNNNNNNNNNNN#)NNNNNNNNNNNNNNNNNNNNNN AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*****************************************XNNNNNNNNNNNNNNNN# 4NNNNNNNNNNNNNNNNNNNNN!******************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR NNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN******************************************************************* ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0:nLNNNNNNNNNNNNNNNNNN#UNNNNNNNNNNNNNNNNNNNNNNER 2 JP CO ;CONSOLE ;************************************************************************* ; ; LIST DEVICE STATUS .HNNNNNNNNNNNNNNNNNN#QNNNNNNNNNNNNNNNNNNNNNN RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHANNEL 2 NNNNNNNNNNNNNNNN#%NNNNNNNNNNNNNNNNNNNNNNNOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CHAR THEN 2%NNNNNNNNNNNNNNNN#+NNNNNNNNNNNNNNNNNNNNNN,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***********NNNNNNNNNNNNNNNNN#$NNNNNNNNNNNNNNNNNNNNN!*************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;************wNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN********************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HE4uBNNNNNNNNNNNNNNNN#aNNNNNNNNNNNNNNNNNNNNNN; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLE 0 CP NNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNN! CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**********************************************************p9NNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNINPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;******tNNNNNNNNNNNNNNNNN# DXNNNNNNNNNNNNNNNNNNNNN! JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; ; SERIAL CHANNEL 3xINNNNNNNNNNNNNNNNN#&NNNNNNNNNNNNNNNNNNNNNNWAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NTS) ;IF NOT CHAR NNNNNNNNNNNNNNNNN#,5NNNNNNNNNNNNNNNNNNNNNN*************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;************************************** ; ; ALrNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!*************************************************** EXLF: CALL EXPR POP DE POP HL ;***********************************BNNNNNNNNNNNNNNNN# &NNNNNNNNNNNNNNNNNNNNNNX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS1!NNNNNNNNNNNNNNNNN#RNNNNNNNNNNNNNNNNNNNNN!2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*****************************************************$NNNNNNNNNNNNNNNN#8NNNNNNNNNNNNNNNNNNNNNN********** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CON:u'NNNNNNNNNNNNNNNNN#7NNNNNNNNNNNNNNNNNNNNNN******************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSTAT0 ;PRINTER 0 _BNNNNNNNNNNNNNNNNN#!wiNNNNNNNNNNNNNNNNNNNNNNOUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;*****************************NNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNNOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;***********************************3!NNNNNNNNNNNNNNN#-2NNNNNNNNNNNNNNNNNNNNNNTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3: EQU IOER ;*CgNNNNNNNNNNNNNNNNN#zNNNNNNNNNNNNNNNNNNNNNN**************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;************.0HNNNNNNNNNNNNNNNNN# uNNNNNNNNNNNNNNNNNNNNN! A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEXbBNNNNNNNNNNNNNNNNN#ANNNNNNNNNNNNNNNNNNNNNN******************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT;mNNNNNNNNNNNNNNNN#kNNNNNNNNNNNNNNNNNNNNNNSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPUT SELECTOR ; ENTRNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNCP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;************************NNNNNNNNNNNNNNNN#"":NNNNNNNNNNNNNNNNNNNNNN******************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP 20H JP M,SO1 ;M^NNNNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNNN*** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NOT READY THEN WAIT COINNNNNNNNNNNNNNNNN#.gWNNNNNNNNNNNNNNNNNNNNNN************************************* ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO0: CALL LSTATpBNNNNNNNNNNNNNNN#KNNNNNNNNNNNNNNNNNNNNNN*************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;*******~NNNNNNNNNNNNNNNN# DNNNNNNNNNNNNNNNNNNNNNN DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BLNNNNNNNNNNNNNNNNNN#rNNNNNNNNNNNNNNNNNNNNNN - A= 0: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTS: LD A,(ErNNNNNNNNNNNNNNNNN#ZNNNNNNNNNNNNNNNNNNNNNNY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*************************************************iNNNNNNNNNNNNNNNN#7NNNNNNNNNNNNNNNNNNNNNN******************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4: SC1, 8:.NNNNNNNNNNNNNNNN## NNNNNNNNNNNNNNNNNNNNNNSERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;******************BNNNNNNNNNNNNNNNN#)NNNNNNNNNNNNNNNNNNNNNN JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1 ; LD AoNNNNNNNNNNNNNNNNN#/TfNNNNNNNNNNNNNNNNNNNNN!0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI1DO),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE \NNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN******************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHERa$NNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;************************************************+INNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNNIOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 ;* ؉tBލ|J摵P핻U$^,Ȟd2͢i6ӦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!Y OUT (PRI2CNT),A ; TO WORK PROPERLY ; IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST BUSY RET Z ; 3NNNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNNN; ;************************************** LO2: EQU IOER LSTAT2: EQU IOER ;************************************** ; ; SHNNNNNNNNNNNNNNNN$ RNNNNNNNNNNNNNNNNNNNNNNG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR ' QMSG: DM '????' LOGMSG: DM 'ZMON VERS 1.',HIGH VERSN,LOW VERSN,CR,LF SUBTTL DATA C/NNNNNNNNNNNNNNNNN$rNNNNNNNNNNNNNNNNNNNNNNUTPUT PORT DW QPRT ;P DW QUERY ;Q DISPLAY LOGICAL & PHYSICAL DEVICES DW QPRT ;R DW SUBS ;S SUBSTITUTE MEMORY DW MT>]NNNNNNNNNNNNNNNN$HNNNNNNNNNNNNNNNNNNNNNN2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TAB͖NNNNNNNNNNNNNNNNN$7NNNNNNNNNNNNNNNNNNNNNN 80H DB 'R',RLOC DB -1 END QmNNNNNNNNNNNNNNNN$%ݰNNNNNNNNNNNNNNNNNNNNNNis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelNNNNNNNNNNNNNNNN$+NNNNNNNNNNNNNNNNNNNNN!t. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4'NNNNNNNNNNNNNNNNN$BNNNNNNNNNNNNNNNNNNNNN!LD A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;*************************************!INNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNN!ERIAL CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER ;**************************sNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNONSTANTS ;############################################################################ ; ; TBL CONTAINS THE ADDRESSES OF THE F NNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNEST ;T TEST MEMORY DW QPRT ;U DW COMP ;V VERIFY (COMPARE) MEMORY DW QPRT ;W DW XMNE ;X EXAMINE & CHANGE REGISTERS NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNLE DB '3' ; CONSOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;-----------------------------YWNNNNNNNNNNNNNNNNN$ "ENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$&NNNNNNNNNNNNNNNNNNNNNNease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,NNNNNNNNNNNNNNNN$,g(NNNNNNNNNNNNNNNNNNNNNNot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi`NNNNNNNNNNNNNNNNN$qNNNNNNNNNNNNNNNNNNNNNN* LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;mNNNNNNNNNNNNNNNNNN$ ;NNNNNNNNNNNNNNNNNNNNNN************ ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IOER SO1: EQU IOER ;******pNNNNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNNNCOMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;###########################################################]HNNNNNNNNNNNNNNNN$%NNNNNNNNNNNNNNNNNNNNNN DW QPRT ;Y DW BYE ;Z SLEEP UNTILL BELL ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: NNNNNNNNNNNNNNNN$*NNNNNNNNNNNNNNNNNNNNNN---- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLO+GyNNNNNNNNNNNNNNNNN$!tNNNNNNNNNNNNNNNNNNNNN! TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMNNNNNNNNNNNNNNNNNN$'NNNNNNNNNNNNNNNNNNNNNNning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to uNNNNNNNNNNNNNNN$-TNNNNNNNNNNNNNNNNNNNNNNnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8[6NNNNNNNNNNNNNNNN$gNNNNNNNNNNNNNNNNNNNNN!OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1: LD A,[1 SHL CENxNNNNNNNNNNNNNNNNN$ hNNNNNNNNNNNNNNNNNNNNNN******************************** ; ; SERIAL CHANNEL 2 (SC2) ; ;************************************** SI2: EQU IOER SO2: EwINNNNNNNNNNNNNNNNN$'NNNNNNNNNNNNNNNNNNNNNN################# TBL: DW ASGN ;A ASSIGN PHYSICAL TO LOGICAL DEVICES DW BOOTC ;B BOOT DISK DW QPRT ;C DW DISP ;D DISPNNNNNNNNNNNNNNNN$vNNNNNNNNNNNNNNNNNNNNNNDB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST NNNNNNNNNNNNNNNN$bNNNNNNNNNNNNNNNNNNNNN!C DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',@ NNNNNNNNNNNNNNNN$"D'NNNNNNNNNNNNNNNNNNNNNN MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************eNNNNNNNNNNNNNNNNNN$(NNNNNNNNNNNNNNNNNNNNNNboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGh9NNNNNNNNNNNNNNNNN$.JNNNNNNNNNNNNNNNNNNNNNN6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore rHNNNNNNNNNNNNNNNN$VNNNNNNNNNNNNNNNNNNNNNNTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A ; IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHƼNNNNNNNNNNNNNNNNN$ YNNNNNNNNNNNNNNNNNNNNN!QU IOER ;************************************** ; ; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3NNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNLAY MEMORY DW QPRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY $NNNNNNNNNNNNNNNNN$GNNNNNNNNNNNNNNNNNNNNNNDEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SrNNNNNNNNNNNNNNN$QNNNNNNNNNNNNNNNNNNNNNNSLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',D45NNNNNNNNNNNNNNNNN$#wNNNNNNNNNNNNNNNNNNNNNN****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brGNNNNNNNNNNNNNNNN$)NNNNNNNNNNNNNNNNNNNNNNe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@INNNNNNNNNNNNNNNNN$/2{NNNNNNNNNNNNNNNNNNNNNNoutine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; KRNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!L CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; LIST DEVICE 2 (LST2) NNNNNNNNNNNNNNNN$ aNNNNNNNNNNNNNNNNNNNNNN: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR ' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSINNNNNNNNNNNNNNNN$ANNNNNNNNNNNNNNNNNNNNNNINPUT PORT DATA DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M MOVE MEMORY DW QPRT ;N DW OUPT ;O OUTPUT DATA TO ONNNNNNNNNNNNNNNNNN$yNNNNNNNNNNNNNNNNNNNNNNERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '/NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC +NNNNNNNNNNNNNNNN$$NNNNNNNNNNNNNNNNNNNNNNeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtNNNNNNNNNNNNNNNNN$*͎NNNNNNNNNNNNNNNNNNNNNN2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#dNNNNNNNNNNNNNNNNNN$0!6NNNNNNNNNNNNNNNNNNNNNN; 1.11- 27 DEC 87 GRH ; Add bank memory management routines. ; VERSN EQU '11' ;*******************************************[,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNʁe3υk:։r@܍yF㑱~M镶P홺W%[)Ţ`.˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNNN********************************* FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FIR9NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!QU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ; BNKREG EQU 0F4H ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) /NNNNNNNNNNNNNNNN$ eNNNNNNNNNNNNNNNNNNNNNN################################ ; ; FIXED DATA AREA ; ;####################################################################&9NNNNNNNNNNNNNNNN$ENNNNNNNNNNNNNNNNNNNNNNJP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS ; ; MEMORY MANAGEMENT (5) ; JP GETMEM ;RETURN MEMORY DATA (WAS IOCHK8NNNNNNNNNNNNNNNN$xNNNNNNNNNNNNNNNNNNNNNN ROMSEL,A RET SUBTTL MEMORY MANAGEMENT ROUTINES ;************************************************************************=NNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;+e NNNNNNNNNNNNNNNN$%NNNNNNNNNNNNNNNNNNNNNNNK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A RET ; ; ; BANKS NOT THE SAME, DO DISCREET MOVE ; NTSAME: PUSH BC $HNNNNNNNNNNNNNNNN$+ɏNNNNNNNNNNNNNNNNNNNNNN SELECT BANK ; LD A,E OUT (BNKREG),A ; ; FETCH DATA ; LD A,(HL) ; ; RESTORE BANK ; PUSH AF LD A,(CBANK) ONNNNNNNNNNNNNNNNN$uNNNNNNNNNNNNNNNNNNNNNNLES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDZHNNNNNNNNNNNNNNNNNN$:NNNNNNNNNNNNNNNNNNNNNN ;============================ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IONNNNNNNNNNNNNNNNN$0NNNNNNNNNNNNNNNNNNNNNN######## RESERVED EQU 6 ;CHANGE THIS TO RESERV SPACE ORG 0F800H - RESERVED CBANK DS 1 ;CURRENT EXECUTION BANK DBANK DS 1 ; NNNNNNNNNNNNNNNN$$NNNNNNNNNNNNNNNNNNNNNN) JP PUTMEM ;STORE MEMORY DATA (WAS IOSET) JP BNKSEL ;SELECT MEMORY BANK FOR EXECUTION (WAS MEMCK) JP XMOVE ;SELECT MEM3NNNNNNNNNNNNNNNNN$+NNNNNNNNNNNNNNNNNNNNNN**** ; ; BANK SELECT PROCEDURE ; ENTRY- A= BANK ADDRESS ; ;****************************************************************Z^!NNNNNNNNNNNNNNNN$ uNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BMOVE: ; ; IF BANK SELECTED PRIOR TO CALL THEN *[NNNNNNNNNNNNNNNNN$&NNNNNNNNNNNNNNNNNNNNNN;SAVE COUNT EXX POP BC EXX ; LD BC,(DBANK) ;FETCH BANKS ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A NNNNNNNNNNNNNNNNNN$,PNNNNNNNNNNNNNNNNNNNNNNUT (BNKREG),A POP AF ; ; DONE ; RET ;**************************************************************************** HNNNNNNNNNNNNNNNNN$FNNNNNNNNNNNNNNNNNNNNNNE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DzNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNN!BYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 1iBNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNDESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0: NOT, /0: CHANGED) SPSV DS 2̪NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNORY BANKS FOR MOVE (WAS RTS) JP BMOVE ;MEMORY BLOCK MOVE (WAS RTS) ; ; BREAKPOINT VECTOR ; JP REST ;BREAKPOINT ENTRY NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN************ BNKSEL: OUT (BNKREG),A LD (CBANK),A RET ;****************************************************************]NNNNNNNNNNNNNNNNNN$!&DNNNNNNNNNNNNNNNNNNNNNNEXECUTE LDIR ; LD A,(BNKCHG) ;IF BANK SELECTED THEN SKIP BANK SELECT OR A,A JP NZ,BMOVE2 ; EX DE,HL LDIR EX DE,HL nBNNNNNNNNNNNNNNNNN$'NNNNNNNNNNNNNNNNNNNNNN,(DE) EX AF,AF' ; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (HL),A ; INC HL ;NEXT BYTE INC D rNNNNNNNNNNNNNNN$-c)NNNNNNNNNNNNNNNNNNNNNN ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;***********NNNNNNNNNNNNNNNNNN$WNNNNNNNNNNNNNNNNNNNNNNEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ T:NNNNNNNNNNNNNNNNN$ XNNNNNNNNNNNNNNNNNNNNNN5H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H@BNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN ;STACK PTR SAVE LOCATION (WAS 6) SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETS NNNNNNNNNNNNNNNN$FNNNNNNNNNNNNNNNNNNNNN! ; ; MORE CHARACTER I/O ; LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------KINNNNNNNNNNNNNNNN$UNNNNNNNNNNNNNNNNNNNNNN************ ; ; SET BANKS FOR A FOLLOWING MOVE CALL ; ENTRY- B= SOURCE BANK ; C= DESTINATION BANK ; ;*******************NNNNNNNNNNNNNNNN$"sNNNNNNNNNNNNNNNNNNNNN! ; RET ; ; ; CLEAR BANK CHANGE FLAG ; BMOVE2: XOR A,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN USE BLOCK MOVE INSTR۾HNNNNNNNNNNNNNNNNNN$(NNNNNNNNNNNNNNNNNNNNNNE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;+++++++++++++++++zNNNNNNNNNNNNNNNNN$.6zNNNNNNNNNNNNNNNNNNNNNN***************************************************************** PUTMEM: ; ; SELECT BANK ; LD A,E OUT (BNKREG),A ; TNNNNNNNNNNNNNNN$fNNNNNNNNNNNNNNNNNNNNNN ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS DEFBNK EQUk:rNNNNNNNNNNNNNNNN$ iNNNNNNNNNNNNNNNNNNNNNN TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU NNNNNNNNNNNNNNNNNN$#NNNNNNNNNNNNNNNNNNNNNNFOR BASIC I/O ; ;-------------------------------------- ; ; COLD START VECTOR ; CBOOT JP INIT ;COLD START ; ; CHARA NNNNNNNNNNNNNNNNN$wNNNNNNNNNNNNNNNNNNNNNN------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;-----------JNNNNNNNNNNNNNNNNN$fNNNNNNNNNNNNNNNNNNNNN!********************************************************* XMOVE: LD (DBANK),BC XOR A,A ;FLAG CHANGE DEC A LD (BNKCHG),A }F9NNNNNNNNNNNNNNNN$#@&NNNNNNNNNNNNNNNNNNNNNNUCTION ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; OUT (BNKREG),A ;A STILL HAS NNNNNNNNNNNNNNNN$)NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ;zrNNNNNNNNNNNNNNNNN$/KNNNNNNNNNNNNNNNNNNNNNN; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,(CBANK) OUT (BNKREG),A ; ; DONE ; RET SUBTTL INITIALIZ[!NNNNNNNNNNNNNNNN$5NNNNNNNNNNNNNNNNNNNNNN 0 ;DEFAULT Z-80 EXECUTION BANK ;============================ ; ; CONSTANTS ; ;============================ CTRLS Ez[NNNNNNNNNNNNNNNNN$ VNNNNNNNNNNNNNNNNNNNNNN8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 ;############################################ݠ NNNNNNNNNNNNNNNN$vNNNNNNNNNNNNNNNNNNNNN!CTER I/O (6) ; CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST MLrNNNNNNNNNNNNNNNNN$INNNNNNNNNNNNNNNNNNNNNN------------------------------------- DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUTNNNNNNNNNNNNNNNN$3NNNNNNNNNNNNNNNNNNNNNN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ;l?NNNNNNNNNNNNNNNN$$ٱNNNNNNNNNNNNNNNNNNNNNNBANK ; EX DE,HL ;MOVE DATA LDIR EX DE,HL ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBAlrNNNNNNNNNNNNNNNNN$*NNNNNNNNNNNNNNNNNNNNN! E= BANK # ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETMEM: ; ; NNNNNNNNNNNNNNNNNNN$0NNNNNNNNNNNNNNNNNNNNNNATION CODE ;-------------------------------------- ; ; THE COLD INITIALIZATION CODE ; ;------------------------------------iNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNN΁k9Յq@ ۉwEߍ|I摴QV$]+ƞc0̢h6ԦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%a&NNNNNNNNNNNNNNNNNNNNNN-- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; FIX MEMORY BANK ; /$NNNNNNNNNNNNNNNNN%ˀNNNNNNNNNNNNNNNNNNNNNN # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC INNNNNNNNNNNNNNNN% $KNNNNNNNNNNNNNNNNNNNNNNK BY SUBTRACTING ADD HL,SP PUSH HL ;SAVE SP ; INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL SNNNNNNNNNNNNNNNNN%7NNNNNNNNNNNNNNNNNNNNNN************* ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATIONlNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN! POINT TO LAST RAM SPACE ; DEC HL ; ; ADJUST FOR MONITOR RESERVED AREA ; LD BC,[EXIT - ENDX] - [3 * NBKPTS] - RESERVċgNNNNNNNNNNNNNNNNNN%AZNNNNNNNNNNNNNNNNNNNNN!*********** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;*****************iNNNNNNNNNNNNNNNN%%NNNNNNNNNNNNNNNNNNNNNN************************************************ AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1ONNNNNNNNNNNNNNNN%+ NNNNNNNNNNNNNNNNNNNNN!COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURREN5NNNNNNNNNNNNNNNNN%4uNNNNNNNNNNNNNNNNNNNNN! LD A,DEFBNK OUT (BNKREG),A LD (CBANK),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESE rNNNNNNNNNNNNNNNNNN%۾NNNNNNNNNNNNNNNNNNNNNNC ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUT7rNNNNNNNNNNNNNNNN%qNNNNNNNNNNNNNNNNNNNNNNSTACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC ;BC HAS 0 FROM LAST LDIR FINISH DEC D JR NNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;************************************NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNED + 1 ADD HL,BC ;ABOVE CALCULATES TO NEGATIVE #, SO IS SUB ; ; RESTORE & RETURN ; POP BC ;UNPREDICTABLE DURING INIT Y2INNNNNNNNNNNNNNNNN% TNNNNNNNNNNNNNNNNNNNNNN********************* EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;********************************ZNNNNNNNNNNNNNNNNN%&WNNNNNNNNNNNNNNNNNNNNNN: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR dNNNNNNNNNNNNNNNN%,NNNNNNNNNNNNNNNNNNNNN!T ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SE NNNNNNNNNNNNNNNN%DNNNNNNNNNNNNNNNNNNNNNNNT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RENNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL NNNNNNNNNNNNNNNNNN%B)NNNNNNNNNNNNNNNNNNNNN!Z,INIT2 ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WIdNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN**************************************** MEMSIZ: ; ; SAVE REG ; PUSH BC ;MONITOR START LOCATION ; ; INITIALIZE ; NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN RET ;**************************************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP^9NNNNNNNNNNNNNNNNN%!gNNNNNNNNNNNNNNNNNNNNNN******************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR ENNNNNNNNNNNNNNNNN%'fNNNNNNNNNNNNNNNNNNNNNNLATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL NNNNNNNNNNNNNNNN%-"NNNNNNNNNNNNNNNNNNNNNNT UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; WNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNSTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; KZNNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNCRLF ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; POP HL ;MEMTOP LD SP,HL LD DE,EXIT EX DE,HL /hNNNNNNNNNNNNNNNNN%QdNNNNNNNNNNNNNNNNNNNNNNNIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN LD BC,ROM ;SAVE ROM PAGE TO COMPARE TO ; LD HL,-1 ;START AT LOCATION 0 ; ; NON-DESTRUCTIVE TEST UNTIL NO RAM OR MONITO`)NNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNN OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM+BNNNNNNNNNNNNNNNN%"2NNNNNNNNNNNNNNNNNNNNNNACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARI(NNNNNNNNNNNNNNNNN%(XNNNNNNNNNNNNNNNNNNNNNNOR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;INHNNNNNNNNNNNNNNNNN%.wNNNNNNNNNNNNNNNNNNNNNN R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;-------------gNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN LD SP,80H ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY BNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNN LD BC,ENDX - EXIT LDIR ; ; FILL BREAKPOINT ADDRESSES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,NBKPTS * 3 PUSH DE \NNNNNNNNNNNNNNNNNN%bUNNNNNNNNNNNNNNNNNNNNN!CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD H$;INNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNR ROM BASE INCURRED ; MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A ; CP (HL) CPL LD (HL),A ; JR NZ,MEMSZ2 ;NO RAM ;mNNNNNNNNNNNNNNN%'8NNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SBNNNNNNNNNNNNNNNN%#NNNNNNNNNNNNNNNNNNNNNNAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE &sgNNNNNNNNNNNNNNNNN%)iNNNNNNNNNNNNNNNNNNNNNNF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;--------NNNNNNNNNNNNNNNNN%/DNNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;rNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTERNNNNNNNNNNNNNNNN% zNNNNNNNNNNNNNNNNNNNNNNPOP HL DEC HL LDIR ; ; RESERVE REGISTER IMAGE SPACE FROM STACK TO EXIT ROUTINE JUST STORED ; LD HL,-24 ;BACK UP STACNNNNNNNNNNNNNNNN%7NNNNNNNNNNNNNNNNNNNNNNL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;***************************************************************JNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN LD A,H ;SEE IF ON MONITOR BORDER CP A,B JR NZ,MEMSZ1 ; ; DONE WITH TEST, CALCULATE TOP OF FREE RAM ; MEMSZ2: ; ;NNNNNNNNNNNNNNNN%rkNNNNNNNNNNNNNNNNNNNNNNIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;***************************.(9NNNNNNNNNNNNNNNN%$5NNNNNNNNNNNNNNNNNNNNNN CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;****************************NNNNNNNNNNNNNNNNN%*:NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS TNNNNNNNNNNNNNNNNNNN%0WNNNNNNNNNNNNNNNNNNNNNNSTART OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAiSBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNʁe3Ѕm< ׉sAݍzH呴OꕸT#񙿚]+Ǟb0̢g5ҦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%VNNNNNNNNNNNNNNNNNNNNNNL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!-- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS%NNNNNNNNNNNNNNNN% {NNNNNNNNNNNNNNNNNNNNNNR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD ~NNNNNNNNNNNNNNNNN%3NNNNNNNNNNNNNNNNNNNNNN ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2zNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G %NNNNNNNNNNNNNNNNN%ENNNNNNNNNNNNNNNNNNNNNN ;---------------------------- ; ; THE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STbINNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN! TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; NNNNNNNNNNNNNNNN%F(NNNNNNNNNNNNNNNNNNNNNNHL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE 3NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; :HNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNCE_LAST> ; ;---------------------------------------------------------------------------- COMP: CyNNNNNNNNNNNNNNNNNN% cNNNNNNNNNNNNNNNNNNNNNNH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;-----------------------------------R'NNNNNNNNNNNNNNNNN%&gNNNNNNNNNNNNNNNNNNNNNNUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SO9NNNNNNNNNNNNNNNN%,&NNNNNNNNNNNNNNNNNNNNNN;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT B9'NNNNNNNNNNNNNNNNN%0tNNNNNNNNNNNNNNNNNNNNNNACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF 6nHNNNNNNNNNNNNNNNNN% ߿NNNNNNNNNNNNNNNNNNNNNN;---------------------------------------------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C TY NNNNNNNNNNNNNNNNNN%uNNNNNNNNNNNNNNNNNNNNNN LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;********************(NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ; Z ; ;---------------------------------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 CHARS B\NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!ALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 TxNNNNNNNNNNNNNNNNNN%!PNNNNNNNNNNNNNNNNNNNNNN----------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;@nNNNNNNNNNNNNNNNNNN%'VNNNNNNNNNNNNNNNNNNNNNNUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OV]NNNNNNNNNNNNNNN%-NNNNNNNNNNNNNNNNNNNNNNP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP"BNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNCALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFS&BNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNN;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OV96INNNNNNNNNNNNNNNNN%fTNNNNNNNNNNNNNNNNNNNNNN****************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ;NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;--------------NNNNNNNNNNNNNNNN%#9NNNNNNNNNNNNNNNNNNNNNNHEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OX>NNNNNNNNNNNNNNNN%"NNNNNNNNNNNNNNNNNNNNNNSEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALNNNNNNNNNNNNNNNNNN%(hNNNNNNNNNNNNNNNNNNNNNNVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;---------- rNNNNNNNNNNNNNNNNN%.@NNNNNNNNNNNNNNNNNNNNNN2. ; ;---------------------------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT PNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE jNNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNNNNNNNNNNNNNNNNNNN%UeNNNNNNNNNNNNNNNNNNNNNN ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOyNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS 8NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!UTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------------------------------------- 'NNNNNNNNNNNNNNNNN%#6NNNNNNNNNNNNNNNNNNNNNNL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,NNNNNNNNNNNNNNNN%)YNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------ ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A E NNNNNNNNNNNNNNNNN%/sNNNNNNNNNNNNNNNNNNNNNNREGISTERS ; CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ;YES,NNNNNNNNNNNNNNNNN%ρNNNNNNNNNNNNNNNNNNNNNNLD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;--------------------------------------------------------------------------.eNNNNNNNNNNNNNNNN% JNNNNNNNNNNNNNNNNNNNNNNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JdNNNNNNNNNNNNNNNN%6NNNNNNNNNNNNNNNNNNNNNNBYTE) RET ;---------------------------------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYEaNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNOF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK Iͅ NNNNNNNNNNNNNNNN%E[NNNNNNNNNNNNNNNNNNNNNN ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE SrNNNNNNNNNNNNNNNN%$NNNNNNNNNNNNNNNNNNNNNNDIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT NNNNNNNNNNNNNNNNN%* NNNNNNNNNNNNNNNNNNNNNNSPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONHNNNNNNNNNNNNNNNNNN%0`NNNNNNNNNNNNNNNNNNNNNN BUT SET BP ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PU|mHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁j8ԅp? ډvDލzG㑱~M땸T#񙾚[)Þ^+Ǣc1ͦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IFZNNNNNNNNNNNNNNNNN&P\NNNNNNNNNNNNNNNNNNNNN!; IF MORE ALLOWED THEN CONTINUE ; DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL*jINNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNN. ; ; I ; ;---------------------------------------------------------------------------- INPT: CALL EXPR1 ;GENNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNTE ADDR. ; ; M ; ;--------------------------------------------------------------2NNNNNNNNNNNNNNNNN&p NNNNNNNNNNNNNNNNNNNNNNINSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERE'NNNNNNNNNNNNNNNNNN&چNNNNNNNNNNNNNNNNNNNNN!INUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z fHNNNNNNNNNNNNNNNN&%0NNNNNNNNNNNNNNNNNNNNNN CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A _yNNNNNNNNNNNNNNNN&+NNNNNNNNNNNNNNNNNNNNNN----------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,{NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN! LAST = CR THEN EXIT CP CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO INNNNNNNNNNNNNNNNNN&@bNNNNNNNNNNNNNNNNNNNNNN CRLF ;NEW LINE FOR PGM ; POP HL ;GET RID OF STACK JUNK ; ; PASS IN LOCATION OF RESTORE ROUTINE ; LD HL,RS9 PUSH H.XBNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNT INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JiNNNNNNNNNNNNNNNN&|NNNNNNNNNNNNNNNNNNNNNN-------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------z NNNNNNNNNNNNNNNN&%sNNNNNNNNNNNNNNNNNNNNNND BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THNNNNNNNNNNNNNNNNN& -NNNNNNNNNNNNNNNNNNNNN!SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR2rNNNNNNNNNNNNNNNNN&&eNNNNNNNNNNNNNNNNNNNNNNCALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LDӦ!NNNNNNNNNNNNNNNN&,@NNNNNNNNNNNNNNNNNNNNNNXAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNTRAP STORAGE ADD HL,SP ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE.yNNNNNNNNNNNNNNNN& sSNNNNNNNNNNNNNNNNNNNNN!L ; ; INSERT RESTART BREAKPOINT VECTOR TO RST 8 ; LD HL,REST LD (9),HL ;SET BP VECTOR ADDR ; ; RESTORE ROUTINE IS NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG :: 0..FH (>NNNNNNNNNNNNNNNNN&BNNNNNNNNNNNNNNNNNNNNNNE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;---------$ZNNNNNNNNNNNNNNNNN&!NNNNNNNNNNNNNNNNNNNNNN CALL Z,LADRB JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TDNNNNNNNNNNNNNNNNN&'VNNNNNNNNNNNNNNNNNNNNNN C,A CALL CONOUT DJNZ BITS1 POP DE RET ;---------------------------------------------------------------------------- [NNNNNNNNNNNNNNN&-qNNNNNNNNNNNNNNNNNNNNNNLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RE5NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN ;GET TRAP ADDR POP HL ;SPTR ; LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 ; LD (HL),E ;SAVE BP ADDR INC HL dm NNNNNNNNNNNNNNNNN& &NNNNNNNNNNNNNNNNNNNNNNON STACK, SO COMPUTE ENTRY ADDRESS ; LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP ; ; EXECUTE THE RESTORE & GOTO ; 8NNNNNNNNNNNNNNNNN&ʸNNNNNNNNNNNNNNNNNNNNN!TO_OUTPUT> ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUTWdNNNNNNNNNNNNNNNN&`NNNNNNNNNNNNNNNNNNNNNNPASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHHNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINERNNNNNNNNNNNNNNNN&"ONNNNNNNNNNNNNNNNNNNNN!ESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK UNNNNNNNNNNNNNNNNNN&(FNNNNNNNNNNNNNNNNNNNNNN ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUESvvNNNNNNNNNNNNNNNNN&."NNNNNNNNNNNNNNNNNNNNNNT C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DEvBNNNNNNNNNNNNNNN&6>NNNNNNNNNNNNNNNNNNNNNN LD (HL),D INC HL ; LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL ; LD A,0CFH ;INSERT THE BP LD (DE),A ;NNNNNNNNNNNNNNNN& 1NNNNNNNNNNNNNNNNNNNNNN POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;---------------------------------------------------------------------7NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN (C),E RET ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTbrNNNNNNNNNNNNNNNNN&S/NNNNNNNNNNNNNNNNNNNNN!K ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-------------------nNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURRNNNNNNNNNNNNNNNN&#~NNNNNNNNNNNNNNNNNNNNN!; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;-----------------------------------------------k7NNNNNNNNNNNNNNNN&)uNNNNNNNNNNNNNNNNNNNNNN MAY BE MODIFIED 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,'BNNNNNNNNNNNNNNNNN&/NNNNNNNNNNNNNNNNNNNNNN),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE aNNNNNNNNNNNNNNNN&cmNNNNNNNNNNNNNNNNNNNNN! ; IF NO MORE ARGS THEN DONE WITH BREAKPOINTS ; GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 ; y0NNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNN------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE0NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYՖ9NNNNNNNNNNNNNNNNN&CNNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTgyNNNNNNNNNNNNNNNN&$NNNNNNNNNNNNNNNNNNNNN!----------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 0.NNNNNNNNNNNNNNNNN&* NNNNNNNNNNNNNNNNNNNNNNL,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;-----------------------------------------------------------FNNNNNNNNNNNNNNNNN&0^NNNNNNNNNNNNNNNNNNNNNN INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNʁg4хm< ׉tBݍzG㑲NꕷR Y'ž_-Ȣd2ϦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK GNNNNNNNNNNNNNNNNN&glNNNNNNNNNNNNNNNNNNNNNN ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LDINNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNNDAA CONVERT ADC A,40H DAA LD C,A RET ;*************************************************************** ; ; ECHO RO>8NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DIS NNNNNNNNNNNNNNNN&GNNNNNNNNNNNNNNNNNNNNNN************************************ HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HIL$NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNET ;**************************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM INNNNNNNNNNNNNNNN&%NNNNNNNNNNNNNNNNNNNNNNNE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYNNNNNNNNNNNNNNNN&+$NNNNNNNNNNNNNNNNNNNNN!DJNZ RS1 ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ;GET BREAKPOINT LOCATION + 1 ; DEC BC ;BACK UP TO RESTART rNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,Yc NNNNNNNNNNNNNNNNNN&wRNNNNNNNNNNNNNNNNNNNNN! A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) rNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;***********************************YNNNNNNNNNNNNNNNN&1LNNNNNNNNNNNNNNNNNNNNNNALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPWNNNNNNNNNNNNNNNNN&CNNNNNNNNNNNNNNNNNNNNNNOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR INNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNNTHE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMIV NNNNNNNNNNNNNNNNN&&RNNNNNNNNNNNNNNNNNNNNNNSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOF9HNNNNNNNNNNNNNNNN&,pNNNNNNNNNNNNNNNNNNNNNNINSTRUCTION ; LD SP,HL ;SET THE MONITOR STACK ; LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE ; LD D,NBKPTS ; RS2: L*NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNXA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE]nNNNNNNNNNNNNNNNN& DcNNNNNNNNNNNNNNNNNNNNNN;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES)NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!**************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONONNNNNNNNNNNNNNNN&}NNNNNNNNNNNNNNNNNNNNNNARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;**************************************************************************** HILO:x9NNNNNNNNNNNNNNNN&!rNNNNNNNNNNNNNNNNNNNNNN<> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;****************************************yNNNNNNNNNNNNNNNNN&!,NNNNNNNNNNNNNNNNNNNNN!TER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CAe NNNNNNNNNNNNNNNNNN&'aNNNNNNNNNNNNNNNNNNNNNNTWARE AT START OF REST. ; ;**************************************************************************** REST: ; ; SAVE 80HNNNNNNNNNNNNNNNN&-ANNNNNNNNNNNNNNNNNNNNNND A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT k!NNNNNNNNNNNNNNNN&2?NNNNNNNNNNNNNNNNNNNNNN IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY CHNNNNNNNNNNNNNNNNN& 0NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLEiNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNUT LD A,C ;RESTORE CHAR IN A POP BC RET ;*************************************************************** ; ; EXPR3yNNNNNNNNNNNNNNNN&W.NNNNNNNNNNNNNNNNNNNNNN INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN*********************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CJ9NNNNNNNNNNNNNNNN&"NNNNNNNNNNNNNNNNNNNNNNRRY FLAG. ; ;**************************************************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF C7rNNNNNNNNNNNNNNNNN&(qNNNNNNNNNNNNNNNNNNNNNN80 REGS FIRST SO WE CAN WORK ; PUSH HL PUSH DE PUSH BC PUSH AF ; ; GET THE MONITOR STACK LOCATION ; CALL MEMSIZ NNNNNNNNNNNNNNNNN&.NNNNNNNNNNNNNNNNNNNNNN ; RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ; RS4: INC BC ;NONE FOUND ; RS5: LD HL,LLOCX ; POP WNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR T[NNNNNNNNNNNNNNNNNN& "NNNNNNNNNNNNNNNNNNNNNN OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;*************TNNNNNNNNNNNNNNNNNN&ιNNNNNNNNNNNNNNNNNNNNN! ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;************************************ZINNNNNNNNNNNNNNNNN&dNNNNNNNNNNNNNNNNNNNNNNET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ;9NNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;*******************************************************SHNNNNNNNNNNNNNNNNNN&#NNNNNNNNNNNNNNNNNNNNNNNHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z NNNNNNNNNNNNNNNNNN&)BNNNNNNNNNNNNNNNNNNNNNN ; ; SET UP PTR TO REGISTER SAVE AREA ABOVE STACK ; EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP ; LD B,4 CNNNNNNNNNNNNNNNNN&/#NNNNNNNNNNNNNNNNNNNNNNDE ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D ; PUSH BC ; LD C,'*' ;OUTPUT BREAK INDICATION CALL CO.NNNNNNNNNNNNNNNNN&T]NNNNNNNNNNNNNNNNNNNNNNOF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1sGNNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNN!************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS 3$NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN*************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;********NNNNNNNNNNNNNNNNNN&t!NNNNNNNNNNNNNNNNNNNNNN EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;**********************.NNNNNNNNNNNNNNNN&އNNNNNNNNNNNNNNNNNNNNNN******** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RNNNNNNNNNNNNNNNN&$4NNNNNNNNNNNNNNNNNNNNNN CCF ;ELSE RETURN NC RET ;**************************************************************************** ; ; REST ROUTI NNNNNNNNNNNNNNNNN&*NNNNNNNNNNNNNNNNNNNNNN ;FOUR REGS EX DE,HL ; ; SAVE AF,BC,DE,HL ; RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE $NNNNNNNNNNNNNNNNNN&0nNNNNNNNNNNNNNNNNNNNNNNNOUT ; POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 ; INC HL INC HL LD (HL),E ;RESTORE UH9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNN΁i7Ӆo> ىsA܍wEᑯ{J敳N뙸U#𝾞Z(â_,ȦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN!SER PC INC HL LD (HL),D ; EX DE,HL ;OUTPUT BP LOCATION CALL LADR ; RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256rNNNNNNNNNNNNNNNNN'&NNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- RS9: PUSH HL RST 8 ;FORCE BP ; ;-----------NNNNNNNNNNNNNNNN' #NNNNNNNNNNNNNNNNNNNNNN------------------ ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (.XBNNNNNNNNNNNNNNNN'_NNNNNNNNNNNNNNNNNNNNNNSH HL LD HL,RSTMSG CALL PRTWD POP HL POP AF JP REST ;------------------------------------------------------------NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNC,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BzNNNNNNNNNNNNNNNNNN'2NNNNNNNNNNNNNNNNNNNNNNE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;********************************NNNNNNNNNNNNNNNN'%FlNNNNNNNNNNNNNNNNNNNNNNINE. ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP NNNNNNNNNNNNNNNN'+ecNNNNNNNNNNNNNNNNNNNNN!HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** /+NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN ; RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LDxdNNNNNNNNNNNNNNNNNN'6NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------- ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTNNNNNNNNNNNNNNNN'pNNNNNNNNNNNNNNNNNNNNNNDETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THdoNNNNNNNNNNNNNNNN'pNNNNNNNNNNNNNNNNNNNNN!---------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;-----------------------------------------------------s,NNNNNNNNNNNNNNNN'SNNNNNNNNNNNNNNNNNNNNNNITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA NNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNN******************************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 rNNNNNNNNNNNNNNNNN'&?NNNNNNNNNNNNNNNNNNNNNNHL RET ;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON 9NNNNNNNNNNNNNNNN',NNNNNNNNNNNNNNNNNNNNNN LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;**************************brNNNNNNNNNNNNNNNN',NNNNNNNNNNNNNNNNNNNNN! A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A ; RS8: INC HL |NNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNNES THE 'PC' ; ;---------------------------------------------------------------------------- EXIT: ; ; FIRST RESTORE THE Z|NNNNNNNNNNNNNNNNN'ANNNNNNNNNNNNNNNNNNNNNNEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;----7NNNNNNNNNNNNNNNN'CNNNNNNNNNNNNNNNNNNNNNN----------------------- COMERR: CALL PRTWD JP WSVEC ;*******************************************************************NNNNNNNNNNNNNNNNN'`NNNNNNNNNNNNNNNNNNNNNN RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ;!NNNNNNNNNNNNNNNNN'!NNNNNNNNNNNNNNNNNNNNNN CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;**************************rNNNNNNNNNNNNNNNNN'' NNNNNNNNNNNNNNNNNNNNNNTHE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*******************NNNNNNNNNNNNNNN'-NNNNNNNNNNNNNNNNNNNNNN****************************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2,7NNNNNNNNNNNNNNNNN'sNNNNNNNNNNNNNNNNNNNNNN ;DO NEXT BP DJNZ RS7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUINNNNNNNNNNNNNNNNN' PNNNNNNNNNNNNNNNNNNNNNN80 UNIQUES ; POP BC LD A,C LD R,A LD A,B LD I,A POP IY POP IX POP AF POP BC POP DE POP HL ; ; NOW DO sgBNNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------ IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE)\>NNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN********* ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO aNNNNNNNNNNNNNNNN'aNNNNNNNNNNNNNNNNNNNNNN CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;**************************************************************4NNNNNNNNNNNNNNNN'"NNNNNNNNNNNNNNNNNNNNNN************************************* ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CRVNNNNNNNNNNNNNNNNNN'(00NNNNNNNNNNNNNNNNNNNNNN******************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA ,NNNNNNNNNNNNNNNNN'.NNNNNNNNNNNNNNNNNNNNNN 3: CON3 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z'BNNNNNNNNNNNNNNN'@NNNNNNNNNNNNNNNNNNNNNNSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC ; ; GOTO MONITOR ; JP WINITA ;RETURN TO MONITOR ;--------------rPrNNNNNNNNNNNNNNNN' cNNNNNNNNNNNNNNNNNNNNNNTHE 8080 REGS ; EX AF,AF' EXX POP DE POP BC POP AF POP HL ;STACK PTR LD SP,HL DB 0 ;'NOP' OR PLACE FOR 'EI' GHNNNNNNNNNNNNNNNNNN'=NNNNNNNNNNNNNNNNNNNNNN,A LD HL,IOMSG JR COMERR ;---------------------------------------------------------------------------- ; ; UNINITIALINNNNNNNNNNNNNNNNN'%NNNNNNNNNNNNNNNNNNNNNNPARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;********************************************************************^NNNNNNNNNNNNNNNN'PNNNNNNNNNNNNNNNNNNNNNN****** CONI: CALL CI AND 7FH RTS: RET ;**************************************************************************** ; Z/NNNNNNNNNNNNNNNN'#NNNNNNNNNNNNNNNNNNNNNN-LF. ; ;*************************************************************** EXLF: CALL EXPR POP DE POP HL ;*************INNNNNNNNNNNNNNNN')NNNNNNNNNNNNNNNNNNNNNN RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; IdNNNNNNNNNNNNNNNNN'/NNNNNNNNNNNNNNNNNNNNNN,CO0 ;CONSOLE 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*******************************dNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------- ; ; THE FOLLOWING CODE IS MOVED TO THE MONITOR STACK AREA ; ^!NNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNN! LD HL,0 ;'HL' REGISTER JP 0 ;'PC' REGISTER ; ENDX: EQU $ ;----------------------------------------------------------чINNNNNNNNNNNNNNNN'nNNNNNNNNNNNNNNNNNNNNNNZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------- RSTER: PUSH AF PUiNNNNNNNNNNNNNNNNN'5NNNNNNNNNNNNNNNNNNNNNN******** QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD rNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THԈNNNNNNNNNNNNNNNN'$u]NNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LVNNNNNNNNNNNNNNNNN'*VRNNNNNNNNNNNNNNNNNNNNNN; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL NNNNNNNNNNNNNNNNN'0NNNNNNNNNNNNNNNNNNNNNN****************************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2:$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNˁh5хm< ׉sA܍yF⑱M镶R Y'^,Ȣd2ЦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'~NNNNNNNNNNNNNNNNNNNNNN CON2, 3: CON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;*****************************************************************J$NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;***************************INNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..J'NNNNNNNNNNNNNNNNN'oNNNNNNNNNNNNNNNNNNNNNN CP 20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVER!NNNNNNNNNNNNNNNN'1NNNNNNNNNNNNNNNNNNNNNNEQU CO0 CSTS1: EQU CSTS0 ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;**************NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNHIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI2CNT),A ; TO WORK PROPERLY ; IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRbNNNNNNNNNNNNNNNN'%q\NNNNNNNNNNNNNNNNNNNNNN** ; ; LIST DEVICE 2 (LST2) ; ;************************************** LO2: EQU IOER LSTAT2: EQU IOER ;***************NNNNNNNNNNNNNNNN'+RSNNNNNNNNNNNNNNNNNNNNNNDM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR ' QMSG: DM '????' LOGMSG: DM 'ZMON VERS 1.',HIGH VERSN,LO\NNNNNNNNNNNNNNNNN'-NNNNNNNNNNNNNNNNNNNNN!******** CSTS: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CST9NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN********************************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTEpNNNNNNNNNNNNNNNN'@NNNNNNNNNNNNNNNNNNNNNN3)= 0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;**********************************************0NNNNNNNNNNNNNNNN'GNNNNNNNNNNNNNNNNNNNNNNS ;************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0:NNNNNNNNNNNNNNNNN'dNNNNNNNNNNNNNNNNNNNNNN************************ CO2: EQU CO0 ;IOER CSTS2: EQU CSTS0 ;IOER CI2: EQU CI0 ;IOER ;*********************************{M NNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNNI1BSB] ;TEST BUSY RET Z ; LD A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;******9;dNNNNNNNNNNNNNNNNN'&$NNNNNNNNNNNNNNNNNNNNNN*********************** ; ; SERIAL CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER INNNNNNNNNNNNNNNN',NNNNNNNNNNNNNNNNNNNNNNW VERSN,CR,LF SUBTTL DATA CONSTANTS ;############################################################################ ; ; TBLNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNS3 ;CONSOLE 3 ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY-"NNNNNNNNNNNNNNNN' 2NNNNNNNNNNNNNNNNNNNNNNR 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; NNNNNNNNNNNNNNNNNN'qNNNNNNNNNNNNNNNNNNNNN!********************** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SÌHNNNNNNNNNNNNNNNN'tNNNNNNNNNNNNNNNNNNNNNN CALL CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READrNNNNNNNNNNNNNNNN'WNNNNNNNNNNNNNNNNNNNNNN***** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU CO0 ;IOER CSTS3: EQU CSTS0 ;I5hNNNNNNNNNNNNNNNNN'!NNNNNNNNNNNNNNNNNNNNNN******************************** LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,C ;OUTPUT CHAR SET CENTDST,A OU6iHNNNNNNNNNNNNNNNNNN''>NNNNNNNNNNNNNNNNNNNNNN ;************************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IvoHNNNNNNNNNNNNNNNN'-NNNNNNNNNNNNNNNNNNNNNN CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;############################7\NNNNNNNNNNNNNNNN'DNNNNNNNNNNNNNNNNNNNNNN (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;************************************Ƴ NNNNNNNNNNNNNNNNN' gNNNNNNNNNNNNNNNNNNNNNN ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, at$NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN;X EXAMINE & CHANGE REGISTERS DW QPRT ;Y DW BYE ;Z SLEEP UNTILL BELL ;----------------------- ; ; IOBYTE TABLE ; NNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNN ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',tNNNNNNNNNNNNNNNNNN({NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN ; ; 1.02 27 JAN 89 GRH ; Change Rom Swap address to execute a function call function. ; Also modify to allow AF return vaNNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNLOCK DATA INTO BUFFER PHASECK CLK_WRB JP CLKSET ;SET CLOCK FROM BUFFER IMAGE PHASECK CLK_CAL JP CLKCAL ;RETURN CALENDAqrNNNNNNNNNNNNNNNNNN(!^FNNNNNNNNNNNNNNNNNNNNNNTO MAINTAIN STACK BALANCE IN CASE THE SWAP DID NOT ; TAKE PLACE. THIS CODE REPLACES THAT VALUE WITH OURS. ; INC SP ;SCRAP MdNNNNNNNNNNNNNNNNNN('NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++ ; ; ADJUST ARGUMENTS ; LD C,D ;FUNCTION # IN C ; LD E,L ;DATA PTR IN DE LD D=NNNNNNNNNNNNNNNNNNN(-+NNNNNNNNNNNNNNNNNNNNNN PUSH AF ; ; PROCESS MONTH ; CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GETENNNNNNNNNNNNNNNNNN(UNNNNNNNNNNNNNNNNNNNNNN;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LNNNNNNNNNNNNNNNN( ZNNNNNNNNNNNNNNNNNNNNNNALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0"$NNNNNNNNNNNNNNNNN(hNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN(DNNNNNNNNNNNNNNNNNNNNNNlue. ; VERSN EQU 102 ; ;**************************************************************************** SUBTTL DECLARATIONSWNNNNNNNNNNNNNNNNNN(-NNNNNNNNNNNNNNNNNNNNN!R FUNCTION PHASECK CLK_TIM JP CLKTIM ;RETURN TIME FUNCTION PHASECK CLK_FUN JP CLKFUN SUBTTL MONITOR ROM SWAP POIN:'NNNNNNNNNNNNNNNNNNN(" NNNNNNNNNNNNNNNNNNNNN!ONITOR'S DUMMY VALUE INC SP ; PUSH AF ;REPLACE IT WITH OUR'S ; LD A,MR_RNUM ;SWAP ROMS ; ; THE FOLLOWING 'OUT' INSTtNNNNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNNN,H ; ; EXECUTE FUNCTION ; CALL CLKFUN ; ; GO BACK TO MONITOR ; JR CLKRET SUBTTL FUNCTIONS ;++++++++++++++++}#NNNNNNNNNNNNNNNNNN(.NxNNNNNNNNNNNNNNNNNNNNNN2D LD H,0FH ;MASK {0..99} CALL GETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET NNNNNNNNNNNNNNNNNNNN(dNNNNNNNNNNNNNNNNNNNNNNIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; IINNNNNNNNNNNNNNNNN( kNNNNNNNNNNNNNNNNNNNNNNH DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',7NNNNNNNNNNNNNNNNNN([NNNNNNNNNNNNNNNNNNNNNN TITLE QT CLOCK-CALENDAR DRIVER LIST NOCOND ;**************************************************************************** ; BNNNNNNNNNNNNNNNNNN(uNNNNNNNNNNNNNNNNNNNNNN ;============================================================================ ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEirNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!T ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SWAP ROMS BACK TO MONITOR ROM (CALLER) AGnNNNNNNNNNNNNNNNNNN(#8$NNNNNNNNNNNNNNNNNNNNNNRUCTION MUST RESIDE AT SAME PLACE AS MONITOR ; ROM'S 'OUT' INSTRUCTION. ; IF $ <> MR_XOVER CONMSG **** WARNING! Xover AdNNNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION ; EXIT - A= DAY ; B= MONTH ; C=}rBNNNNNNNNNNNNNNNNNN(/}INNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION ; EXIT - A= SECONDS `NNNNNNNNNNNNNNNNNN(7NNNNNNNNNNNNNNNNNNNNNNSERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB 0rNNNNNNNNNNNNNNNN( .NNNNNNNNNNNNNNNNNNNNNNBPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DBNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN ; QT CLOCK-CALENDAR DRIVER ROUTINES FOR PROM ; ;**************************************************************************** ENNNNNNNNNNNNNNNNNN(KNNNNNNNNNNNNNNNNNNNNNNF ;*INCLUDE CLOCK.DEF ;*INCLUDE CLOKROM.DEF ;*INCLUDE ZMONROM.DEF ; ;======================================================$NNNNNNNNNNNNNNNNNNN(KNNNNNNNNNNNNNNNNNNNNNNAIN ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DS MR_XOVER -$ - 5 ;POSITION 'OUT' INSTNNNNNNNNNNNNNNNNNN($NNNNNNNNNNNNNNNNNNNNNNdress Mismatch! **** ENDIF OUT (M2_RSEL),A ;THIS INSTRUCTION MUST BE AT SAME ; ; MONITOR ROM CONTINUES FROM HERE ; trNNNNNNNNNNNNNNNNNN(*NNNNNNNNNNNNNNNNNNNNNN YEAR ; L= DAY OF WEEK ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: ;NNNNNNNNNNNNNNNNNN(0nNNNNNNNNNNNNNNNNNNNNNN ; B= MINUTES ; C= HOURS ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM:c)BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅuD≱P\,ʒi8֖tCᚰOힼZ)ǣf5NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(oNNNNNNNNNNNNNNNNNNNNNN ; ; WAIT FOR CLOCK TO STABILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {2LNNNNNNNNNNNNNNNNNN(6NNNNNNNNNNNNNNNNNNNNN!UFFER ; CLKRDF: ; ; WAIT FOR SECONDS TO CHANGE ; CALL CLKWAIT ; ; READ ALL REGISTERS (C SET TO CLK_SECL BY CLKWAIT)w% NNNNNNNNNNNNNNNNNN( *NNNNNNNNNNNNNNNNNNNNNNO SET EACH REGISTER ; LD B,13 ;REGISTER COUNT LD C,CLK_SECL ;SET REGISTER # CLKSLP: LD A,(DE) ;GET DATA SET CLK_HOLDzBNNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ CLKFUN: ; ; IF NOT A VALID FUNCTION THEN RETURN ERROR ; LD A,C CP A,FUNS JP C,FUNOK ; XP NNNNNNNNNNNNNNNNNN(JNNNNNNNNNNNNNNNNNNNNNN FUNS EQU ($ - FUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERNNNNNNNNNNNNNNNNNN(ONNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE PROCEDURE ; EXIT - A= CURRENprNNNNNNNNNNNNNNNNNN(%NNNNNNNNNNNNNNNNNNNNNNLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL EX:yNNNNNNNNNNNNNNNNNN(+NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS FROM CLOCK FUNCTION ; ENTRY- C= CLOCKcgaNNNNNNNNNNNNNNNNNN(:NNNNNNNNNNNNNNNNNNNNNN0..79} CALL GETN PUSH AF ;SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B, NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN ; LD B,12 ;REGISTER CNT -1 LD (DE),A ;SAVE SECONDS READ BY CLKWAIT ; GETLP: INC DE ;PTR +1 INC C ;REGISTER + 1 CdNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN,A ;INSURE HOLD BIT OUT (CLK_DATA),A ;OUTPUT DATA ; LD A,C ;GET REG # OUT (CLK_CMD),A SET CLK_WRT,A ;OUTPUT WRITE STNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNOR A,A DEC A SCF RET ; ; CALCULATE FUNCTION EXECUTION ADDRESS ; FUNOK: PUSH HL LD HL,FUNTBL ADD A,A ADD A,L ~NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNSION FUNCTION ; EXIT - HL= BINARY OF VERSION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INNNNNNNNNNNNNNNNNN( ZGNNNNNNNNNNNNNNNNNNNNNNT SECONDS ; C= CLK_SECL ; B= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKWAIT: ĤNNNNNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNN (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ =INNNNNNNNNNNNNNNNNN(,*NNNNNNNNNNNNNNNNNNNNNN REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNA ; ; PROCESS HOURS ; CALL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF R}ONNNNNNNNNNNNNNNNNN( 9NNNNNNNNNNNNNNNNNNNNNNALL GETD ; LD (DE),A ;PUT INTO BUFFER DJNZ GETLP ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++=yNNNNNNNNNNNNNNNNNN(LNNNNNNNNNNNNNNNNNNNNNNROBE OUT (CLK_CMD),A LD A,C OUT (CLK_CMD),A ; ; NEXT REGISTER ; INC DE ;PTR +1 INC C ;REGISTER +1 ; ; IF NOVNNNNNNNNNNNNNNNNNNN('NNNNNNNNNNNNNNNNNNNNNNLD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ; ; FUNCTION TABLE ; FUNÔ'NNNNNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNNN RETVER: LD HL,VERSN XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEVNNNNNNNNNNNNNNNNNN(!ivNNNNNNNNNNNNNNNNNNNNNN; ; FETCH CURRENT SECONDS ; LD C,CLK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIMNNNNNNNNNNNNNNNNNN('NNNNNNNNNNNNNNNNNNNNNN ; ; RETURN CLOCK DATA FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT - A= REGISTER DATA ; ;+++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNN(-,NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH HIGH DIGIT ; INC C CALL GETD LD D,nrNNNNNNNNNNNNNNNNNN(eNNNNNNNNNNNNNNNNNNNNNNET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK BUFFER FUNCTION ; ENTRY-NNNNNNNNNNNNNNNNNN( jNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++ ; ; SET CLOCK FROM BUFFER DATA FUNCTION ; ENTRY- E:HL= CLOCK IMAGE BUFR PTR (13 BYTES LONG) i+dNNNNNNNNNNNNNNNNNN(_NNNNNNNNNNNNNNNNNNNNNNT DONE THEN REPEAT ; DJNZ CLKSLP ; ; RESTART CLOCK ; CLKSTRT: XOR A,A ;CLEAR HOLD OUT (CLK_DATA),A ; OUT (CLK_CWNNNNNNNNNNNNNNNNNN(tNNNNNNNNNNNNNNNNNNNNNNTBL DW RETVER ;0: RETURN VERSION # DW CLKRDF ;1: READ CLOCK BUFFER DW CLKWRF ;2: WRITE CLOCK BUFFER DW CLKCAL ;3: RETU{ NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNST IF BOARD PRESENT FUNCTION ; EXIT - A,L= 0: NOT THERE, /0: THERE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++aNNNNNNNNNNNNNNNNNN("<%NNNNNNNNNNNNNNNNNNNNNNL SECONDS CHANGE ; CLKRWT: CALL GETD AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN ZF ; CP A,A RET ;+7NNNNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++ CLKRETR: ; ; THIS ENTRY IS FROM FUNCTION AND HAS REGISTER IN E ; LD C,E ; BNNNNNNNNNNNNNNNNNN(.yHNNNNNNNNNNNNNNNNNNNNNNA ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++{yNNNNNNNNNNNNNNNNNN(TNNNNNNNNNNNNNNNNNNNNN! E:HL= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; EXIT - A, BC, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++PaNNNNNNNNNNNNNNNNNN( [NNNNNNNNNNNNNNNNNNNNNN; EXIT - BC, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKSET: ; ; PUT BUFFERNNNNNNNNNNNNNNNNNN(lNNNNNNNNNNNNNNNNNNNNNNMD),A ;CLEAR COMMAND RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE FUNCNNNNNNNNNNNNNNNNNNN(ENNNNNNNNNNNNNNNNNNNNNNRN CLOCK CALENDAR DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WAqNNNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(CLK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOTNNNNNNNNNNNNNNNNNN(#NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION ; EXIT - A, B= ? ; ;+++NNNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNN!GETD: ; ; TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us YBNNNNNNNNNNNNNNNNNN(/JyNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- DE= NUMBER (E= LO BCD #, D= HI BCD #) ; H= MASK FORb rNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++ ; CLKRDC: ; ; PUT BUFFER PTR IN DE ; LD E,C LD D,B ; ; FUNCTION ENTERS WITH DE POINTING TO BNNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNN PTR IN DE ; LD E,C LD D,B ; ; FUNCTION HAS PTR IN DE ; CLKWRF: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP T×NNNNNNNNNNNNNNNNNN(9NNNNNNNNNNNNNNNNNNNNNNTION SINGLE ENTRY POINT ; ENTRY- C= FUNCTION # ; EXIT - AF= -1: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++)NNNNNNNNNNNNNNNNNN({NNNNNNNNNNNNNNNNNNNNNNIT FOR CLOCK TO CHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK "NNNNNNNNNNNNNNNNNNNN(|NNNNNNNNNNNNNNNNNNNNNN THERE ; AND A,11000000B ; ; ADJUST SENSE ; XOR A,11000000B LD L,A RET SUBTTL SUPPORT PROCEDURES ;+++++++++eNNNNNNNNNNNNNNNNNN($NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL CByNNNNNNNNNNNNNNNNNN(*NNNNNNNNNNNNNNNNNNNNNNPER DATA SHEET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++NNNNNNNNNNNNNNNNNN(0Y4NNNNNNNNNNNNNNNNNNNNNN HI BYTE ; EXIT - A= NUMBER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETN: ; ; SANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρk: ؅wF≱O퍼X'ƒd3ϖm< ۚwF䞳QZ)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN).NNNNNNNNNNNNNNNNNNNNNNVE REGS ; PUSH BC ;SAVE ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETCH HIGH BYTE ; LD A,D ; rNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) kyNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)KNNNNNNNNNNNNNNNNNNNNNNONS: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. ; VERS EQU '10' ; ;********************٦dNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN******************************************************** CLKCAL: PUSH BC ;SAVE PTR CALL CLKRDC LD DE,CLKWEEK ;ADD OFFS;NNNNNNNNNNNNNNNNNN)hNNNNNNNNNNNNNNNNNNNNNN H,7 ;MASK CALL GETN PUSH AF ;SAVE CALL GETN ;GET MINITS LD B,A LD H,3 ;GET HOURS CALL GETN LD C,A POPjNNNNNNNNNNNNNNNNNN)%6NNNNNNNNNNNNNNNNNNNNN!**************************** ; ; CLOCK SET FUNCTION ; ENTRY- BC= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; EXIT - BC, DE= ? ; +NNNNNNNNNNNNNNNNNN)+9NNNNNNNNNNNNNNNNNNNNNND RET SUBTTL SUPPORT SUBROUTINES ;*************************************** ; ; RETURN CLOCK DATA SUBR ; ENTRY- C= CLOCKNNNNNNNNNNNNNNNNNNN){GNNNNNNNNNNNNNNNNNNNNNN ; MASK OFF NON-NUMERICAL BITS ; AND A,H ;MASK BITS ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LD B,A ;SET CNTNOdNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)>*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)ҒNNNNNNNNNNNNNNNNNNNNNN******************************************************* SUBTTL DECLARATIONS *INCLUDE CLOCK.DEF SUBTTL CODE START ORG yNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNET TO WEEK BYTE POP HL ADD HL,DE EX DE,HL LD A,(DE) ;GET WEEK & SAVE FOR LATER AND 7 LD C,A ;SAVE WEEK IN C FOR y'NNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNN AF RET ;************************************************************ ; ; READ CLOCK TIME FUNCTION ; ENTRY- BC= PTR TO SNNNNNNNNNNNNNNNNNN)&eNNNNNNNNNNNNNNNNNNNNNN ;********************************************************** CLKSET: LD E,C ;DE := PTR LD D,B LD A,[1 SHL CLKHOLD] ;STKvNNNNNNNNNNNNNNNNNN),^NNNNNNNNNNNNNNNNNNNNNN REGISTER # ; EXIT - A= REGISTER DATA ; ;*************************************** GETD: LD A,C ;SET UP READ SET CLKRD,A ;NNNNNNNNNNNNNNNNNN)HvNNNNNNNNNNNNNNNNNNNNNN LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS DIGIT ; TENSLPqINNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN0F800H ;PROM START ;-------------------------------------- ; ; ENTRY VECTORS ; ;-------------------------------------- oNNNNNNNNNNNNNNNNNN)¬NNNNNNNNNNNNNNNNNNNNN!NOW INC DE ;NOW DO DAY LD H,3 ;MASK CALL GETN PUSH AF LD H,1 ;GET MONTH CALL GETN LD B,A LD H,0FH ;GET4SNNNNNNNNNNNNNNNNNNNN)!(NNNNNNNNNNNNNNNNNNNNN! 13 BYTE BUFFER FOR CLOCK DATA ; EXIT - DE= ? ; ;************************************************************ CLKRDC: LD ENNNNNNNNNNNNNNNNNN)'TNNNNNNNNNNNNNNNNNNNNNNOP CLOCK OUT (CLKDAT),A LD B,20 ;DELAY >= 150us FROM HOLD CLKSDL: EX (SP),HL EX (SP),HL DJNZ CLKSDL LD B,13 ;REGIENNNNNNNNNNNNNNNNNN)-mNNNNNNNNNNNNNNNNNNNNN!SET READ BIT OUT (CLKCMD),A EX (SP),HL ;DELAY >= 5us EX (SP),HL IN A,(CLKDAT) ;RETURN DATA RET ;****************BNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ENDBrNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN! JP CLKRDC ;READ CLOCK DATA INTO BUFFER JP CLKSET ;SET CLOCK FROM BUFFER IMAGE JP CLKCAL ;RETURN CALENDAR FUNCTION JP CX3NNNNNNNNNNNNNNNNNN)[;NNNNNNNNNNNNNNNNNNNNNN YEAR CALL GETN LD L,C ;PUT WEEK IN L LD C,A POP AF ;DAY RET ;***********************************************~BNNNNNNNNNNNNNNNNNN)"}NNNNNNNNNNNNNNNNNNNNN!,C ;DE := PTR LD D,B LD C,CLKSECL ;WAIT FOR SECONDS TO CHANGE CALL GETD AND CLKDMSK ;MASK OFF UNWANTED BITS LD B,ApNNNNNNNNNNNNNNNNNN)(jNNNNNNNNNNNNNNNNNNNNNNSTER COUNT LD C,CLKSECL ;SET REGISTER # CLKSLP: LD A,(DE) ;GET DATA SET CLKHOLD,A ;INSURE HOLD BIT OUT (CLKDAT),A ;OUT NNNNNNNNNNNNNNNNNNN).8NNNNNNNNNNNNNNNNNNNNNN************************ ; ; GET NUMBER SUBR ; ENTRY- DE= NUMBER PTR ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; DE= PTR 3NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)-gNNNNNNNNNNNNNNNNNNNNN! TITLE QT CLOCK-CALENDAR DRIVER LIST NOCOND ;*************************************************************************** ;crNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNLKTIM ;RETURN TIME FUNCTION ;********************************************************** ; ; RETURN CALENDAR FUNCTION ; rNNNNNNNNNNNNNNNNNN)h NNNNNNNNNNNNNNNNNNNNNN* ; ; RETURN TIME FUNCTION ; ENTRY- BC= TEMPORARY BUFFER PTR ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; DE= ? ; ;*̈ NNNNNNNNNNNNNNNNNN)#NNNNNNNNNNNNNNNNNNNNNNN CLKRWT: CALL GETD AND CLKDMSK CP B JR Z,CLKRWT LD B,12 ;REGISTER CNT -1 LD (DE),A ;SAVE SECONDS GETLP: INC DE NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) XHNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)x4NNNNNNNNNNNNNNNNNNNNNN ; CLOCK DRIVER ROUTINES FOR PROM ; ;*************************************************************************** ; ; REVISINNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNENTRY- BC= BUFFER PTR TO USE AS TEMPORARY STORAGE ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;**o9NNNNNNNNNNNNNNNNNN)=YNNNNNNNNNNNNNNNNNNNNNN*********************************************** CLKTIM: PUSH BC ;SAVE PTR CALL CLKRDC POP DE ;START WITH SECONDS LDrNNNNNNNNNNNNNNNNNN)$NNNNNNNNNNNNNNNNNNNNN!;PTR +1 INC C ;REGISTER + 1 CALL GETD LD (DE),A ;PUT INTO BUFFER DJNZ GETLP RET ;******************************$NNNNNNNNNNNNNNNNNN)*NNNNNNNNNNNNNNNNNNNNNNA INC DE ;PTR +1 INC C ;REGISTER +1 DJNZ CLKSLP XOR A ;CLEAR HOLD OUT (CLKDAT),A OUT (CLKCMD),A ;CLEAR COMMAN`NNNNNNNNNNNNNNNNNN)0NNNNNNNNNNNNNNNNNNNNNND C,A INC DE ;GET HI BYTE LD A,(DE) AND H ;MASK BITS LD B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF ( NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNˁg6ԅsBމ|LꍸT$’`.ʖi8֚rB~M颸W&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN)$NNNNNNNNNNNNNNNNNNNNNNTENS & MASK) == 0 THEN RETURN UNITS LD C,10 ;ELSE ADD TENS DIGIT TENSLP: ADD A,C DJNZ TENSLP NOTENS: INC DE ;RETURN NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) \INNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)|5NNNNNNNNNNNNNNNNNNNNN! ; ; REVISIONS: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. ; ; 1.01 6 JUL 88 GRH ; Ad4NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNIF ENDM SUBTTL ENTRY POINTS ORG 0F800H ;PROM START PHASECK ?CLKRDB JP CLKRDC ;READ CLOCK DATA INTO BUFFER PHASG%rNNNNNNNNNNNNNNNNNN)9XNNNNNNNNNNNNNNNNNNNNNNOFF GARBAGE {0..7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PRI)NNNNNNNNNNNNNNNNNN)%NNNNNNNNNNNNNNNNNNNNN!PUSH AF ;SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOUNNNNNNNNNNNNNNNNNN)+ NNNNNNNNNNNNNNNNNNNNNNGISTER CNT -1 LD (DE),A ;SAVE SECONDS READ BY CLKWAIT ; GETLP: INC DE ;PTR +1 INC C ;REGISTER + 1 CALL GETD ; LD (~gNNNNNNNNNNNNNNNNNNN)LwNNNNNNNNNNNNNNNNNNNNNNPTR TO NEXT FIELD POP BC RET ENDBNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNd '?' to global names. ; Add clock function executor. ; Remove buffer requirement to read clock data into registers functions.pNNNNNNNNNNNNNNNNNN)ƭNNNNNNNNNNNNNNNNNNNNN!ECK ?CLKWRB JP CLKSET ;SET CLOCK FROM BUFFER IMAGE PHASECK ?CLKCAL JP CLKCAL ;RETURN CALENDAR FUNCTION PHASECK ?CLKTIMINNNNNNNNNNNNNNNNNN) ,NNNNNNNNNNNNNNNNNNNNNNOCESS MONTH ; CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK w\NNNNNNNNNNNNNNNNNNN)&UNNNNNNNNNNNNNNNNNNNNNNRS ; CALL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++\}NNNNNNNNNNNNNNNNNN),iNNNNNNNNNNNNNNNNNNNNNNDE),A ;PUT INTO BUFFER DJNZ GETLP ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN)FNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN):+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)֓NNNNNNNNNNNNNNNNNNNNNN ; VERSN EQU 101 ; ;**************************************************************************** SUBTTL DECLARATIONS ;=$HNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN JP CLKTIM ;RETURN TIME FUNCTION PHASECK ?CLKFUN JP CLKFUN SUBTTL FUNCTIONS ;+++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN)!NNNNNNNNNNNNNNNNNNNNNN{0..99} CALL GETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++"-NNNNNNNNNNNNNNNNNN)'dNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK BUFFER FUNCTION ; ENTRY- BC= PTR TO 13 BYTE B;NNNNNNNNNNNNNNNNNN)-ZNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ; SET CLOCK FROM BUFFER DATA FUNCTION ; ENTRY- BC= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; EXIT - BC, DE= ? )yNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN))fNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN=========================================================================== ; ;*INCLUDE CLOCK.DEF ;*INCLUDE CLOKROM.DEF ; ;aNNNNNNNNNNNNNNNNNN)l NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF W/3NNNNNNNNNNNNNNNNNNNN)"JNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION ; EXIT - A= SECONDS ; B= MINUTES ; C=INNNNNNNNNNNNNNNNNN)(ZNNNNNNNNNNNNNNNNNNNNNNUFFER FOR CLOCK DATA ; EXIT - A, BC, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C NNNNNNNNNNNNNNNNNN).NNNNNNNNNNNNNNNNNNNNNN; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKSET: ; ; PUT BUFFER PTR IN DE ; LD E cNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)WNNNNNNNNNNNNNNNNNNNNNN TITLE QT CLOCK-CALENDAR DRIVER LIST NOCOND ;**************************************************************************** ; NNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN============================================================================ LIST OFF *INCLUDE CLOCK.DEF *INCLUDE CLOKROM.DE\dNNNNNNNNNNNNNNNNNN)_:NNNNNNNNNNNNNNNNNNNNNNEEK ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: ; ; WAIT FOR CLOCK NNNNNNNNNNNNNNNNNN)#yNNNNNNNNNNNNNNNNNNNNNN HOURS ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM: ; ; WAIT FOR CLOiNNNNNNNNNNNNNNNNNN))kNNNNNNNNNNNNNNNNNNNNN!LKRDC: ; ; PUT BUFFER PTR IN DE ; LD E,C LD D,B ; ; FUNCTION ENTERS WITH DE ALREADY POINTING TO BUFFER ; CLKRDF: \NNNNNNNNNNNNNNNNNN)/ #NAME CONMSG **** Phase Error - #NAME Does not Agree With CLOKROM.DEF! **** ENDOnNNNNNNNNNNNNNNNNNNN) iNNNNNNNNNNNNNNNNNNNNNNDATA TO BE STABLE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,?CLKWEEK CALL GETD AND A,7 ;MASK \mrNNNNNNNNNNNNNNNNNN)$7NNNNNNNNNNNNNNNNNNNNNNCK TO STABILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,?CLKSECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN 69NNNNNNNNNNNNNNNNNN)*8NNNNNNNNNNNNNNNNNNNNNN ; ; WAIT FOR SECONDS TO CHANGE ; CALL CLKWAIT ; ; READ ALL REGISTERS (C SET TO ?CLKSECL BY CLKWAIT) ; LD B,12 ;RENNNNNNNNNNNNNNNNNN)0/NNNNNNNNNNNNNNNNNNNNNNO SET EACH REGISTER ; LD B,13 ;REGISTER COUNT LD C,?CLKSECL ;SET REGISTER # CLKSLP: LD A,(DE) ;GET DATA SET ?CLKHOLDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρm< څwF䉳R!\,ʒg6ԖrAݚ|K鞸T#`/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN,A ;INSURE HOLD BIT OUT (?CLKDAT),A ;OUTPUT DATA ; LD A,C ;GET REG # OUT (?CLKCMD),A SET ?CLKWRT,A ;OUTPUT WRITE STRNNNNNNNNNNNNNNNNNN*nNNNNNNNNNNNNNNNNNNNNNN DEC A RET ; ; CALCULATE FUNCTION EXECUTION ADDRESS ; FUNOK: PUSH HL LD HL,FUNTBL ADD A,A ADD A,L LD L,A LD A,(dNNNNNNNNNNNNNNNNNN* NNNNNNNNNNNNNNNNNNNNNN ; EXIT - HL= BINARY OF VERSION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HLmNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ; B= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKWAIT: ; ; FETCH CURRENT SECON|^rNNNNNNNNNNNNNNNNNN*?NNNNNNNNNNNNNNNNNNNNNN; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GET2D: ; dNNNNNNNNNNNNNNNNNN*%NNNNNNNNNNNNNNNNNNNNNNBITS ; AND A,H ;MASK BITS ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LD B,A ;SET CNT LD A,C ;GET UNITS DIGIT #d9NNNNNNNNNNNNNNNNNN*+\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNOBE OUT (?CLKCMD),A LD A,C OUT (?CLKCMD),A ; ; NEXT REGISTER ; INC DE ;PTR +1 INC C ;REGISTER +1 ; ; IF NOT NNNNNNNNNNNNNNNNNN*PNNNNNNNNNNNNNNNNNNNNNN0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ; ; FUNCTION TABLE ; FUNTBL DW RETVER NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN,VERSN XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PR NNNNNNNNNNNNNNNNNN*INNNNNNNNNNNNNNNNNNNNNNNDS ; LD C,?CLKSECL CALL GETD AND A,?CLKDMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWBNNNNNNNNNNNNNNNNNN*jANNNNNNNNNNNNNNNNNNNNN!CTION ; ENTRY- C= CLOCK REGISTER # ; EXIT - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++hNNNNNNNNNNNNNNNNNN* NNNNNNNNNNNNNNNNNNNNN! ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH HIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT MNNNNNNNNNNNNNNNNNNN*&*NNNNNNNNNNNNNNNNNNNNNN JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS DIGIT ; TENSLP: ADD A,C DJNZ TENSLP ; NNNNNNNNNNNNNNNNNN*,rNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*ӪNNNNNNNNNNNNNNNNNNNNNN DONE THEN REPEAT ; DJNZ CLKSLP ; ; RESTART CLOCK ; CLKSTRT: XOR A,A ;CLEAR HOLD OUT (?CLKDAT),A ; OUT (?CLKCMD:D$NNNNNNNNNNNNNNNNNN* = 5us PER DATA SHEET ; EX (SP)tNNNNNNNNNNNNNNNNNN*"}NNNNNNNNNNNNNNNNNNNNNNONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- DE= NUMBER (E= LO BCD #, D= HI BCD #) ; H= MASK FOR HI BYTE ; EXIT - A= NUMBERzdNNNNNNNNNNNNNNNNNN*( NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*y NNNNNNNNNNNNNNNNNNNNNNON SINGLE ENTRY POINT ; ENTRY- C= FUNCTION # ; EXIT - AF= -1: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++34NNNNNNNNNNNNNNNNNNN* ZNNNNNNNNNNNNNNNNNNNNN!O CHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK FUNS EQU ($MNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN,11000000B ; ; ADJUST SENSE ; XOR A,11000000B RET SUBTTL SUPPORT PROCEDURES ;+++++++++++++++++++++++++++++++++++BNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL ?CLKHOLD] OUT (?CLKDAT),A*NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN,HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(?CLKDAT) ;RETURN DATA RET ;+++++++++++++++++++++++++++++++++++++++++ZINNNNNNNNNNNNNNNNNN*#LNNNNNNNNNNNNNNNNNNNNNN ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETN: ; ; SAVE REGS ; PUSH BC ;SAVE _NNNNNNNNNNNNNNNNNN*):NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*/!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*,_NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++ CLKFUN: ; ; IF NOT A VALID FUNCTION THEN RETURN ; LD A,C CP A,FUNS JP C,FUNOK ; XOR A,A :9NNNNNNNNNNNNNNNNNN* ÔNNNNNNNNNNNNNNNNNNNNN! - FUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION _NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE PROCEDURE ; EXIT - A= CURRENT SECONDS ; C= ?CLKSECL _NNNNNNNNNNNNNNNNNN* #NNNNNNNNNNNNNNNNNNNNNN ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL EX (SP),HL DJNZ CLKSDL ; : NNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS FROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGNNNNNNNNNNNNNNNNNN*$LNNNNNNNNNNNNNNNNNNNNNN ; ; FETCH LOW BYTE ; LD A,E AND A,?CLKDMSK LD C,A ; ; FETCH HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL [NNNNNNNNNNNNNNNNNN**oNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*0lNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅvE㉲Q ]-˒j9זvE㚳Q ],ʣh7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;************************************************************* ; ; DISK CONTROLNNNNNNNNNNNNNNNNNN*(^NNNNNNNNNNNNNNNNNNNNNN in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 is ; generati0NNNNNNNNNNNNNNNNNN* ǕNNNNNNNNNNNNNNNNNNNNNNE TIME VARIABLES ; FALSE EQU 0 TRUE EQU NOT FALSE DEBUG EQU FALSE REV EQU 'C' ;BOARD REVISION LEVEL LSTINC EQU FALSEqINNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN+ 30H ;ROM CROSS-OVER POINT PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ; ; CONSTANTS ; BIOSSEC EQU 13 ;STA1dNNNNNNNNNNNNNNNNNN*"NNNNNNNNNNNNNNNNNNNNNNTIONS JR BEGIN ; ; POSITION SWAP RETURN CODE TO MATCH CALLER ; DS XOVER - $ ;POSITION CODE ;-------------------------u NNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNT) ;GET BOARD STATUS AND DDSASW ;COMPUTE BOARD ADDR RLCA OR DDBASE SHR 8 LD H,A LD L,0 LD (DADDR),HL ;STORE ADDtNNNNNNNNNNNNNNNNNN*%HNNNNNNNNNNNNNNNNNNNNNNle (Boot Injection Module) into ; the Double D controller memory. A successful boot ; operation by the Double D will leavetNNNNNNNNNNNNNNNNNN*+kNNNNNNNNNNNNNNNNNNNNNNK COMPLETION OR TIMEOUT ; LD HL,HNGTMO ;SET TIMEOUT VALUES LD BC,0 WAIT: DEC BC LD A,C ;IF TIMED OUT THEN ABORT OR tNNNNNNNNNNNNNNNNNNN*׫NNNNNNNNNNNNNNNNNNNNNNLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;*************************************`dNNNNNNNNNNNNNNNNNN*8`NNNNNNNNNNNNNNNNNNNNNNng a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the request thus ; yrNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ;CONDITIONAL FOR INCLUDE FILE LISTING ;*INCLUDE MONBOARD.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE JDDLOC.DEF ;*INCLUDE ISASI.D NNNNNNNNNNNNNNNNNN*~~NNNNNNNNNNNNNNNNNNNNNNRT SECTOR OF BIOS HNGTMO EQU 5 ;HANGUP TIMOUT SECSIZ EQU 128 NMINT EQU 66H ; LF: EQU 0AH CR: EQU 0DH STPOC EQU BCDSE pNNNNNNNNNNNNNNNNNN*]qNNNNNNNNNNNNNNNNNNNNNN------------- ; ; SWAP ROMS TO RETURN TO CALLER ; ;-------------------------------------- DKRET: LD A,XMONROM ;SELECT MONINNNNNNNNNNNNNNNNNN* /NNNNNNNNNNNNNNNNNNNNNNR LD A,DDSHLT ;STORE HALT FLAG FOR BIOS USE LD (DMASK),A LD (DTEMP),A ;SET REPEAT FLAG = NZ ;======================F1NNNNNNNNNNNNNNNNNNN*&NNNNNNNNNNNNNNNNNNNNNN DCM in bank 0 and ; BIOS in bank 1. The remainder of this module then moves ; the BIOS image to the proper system addressNNNNNNNNNNNNNNNNNN*,BNNNNNNNNNNNNNNNNNNNNNNB JR NZ,WAIT2 DEC L OR L SCF JP Z,ABORT WAIT2: IN A,(DDPORT) ;INPUT DD STATUS AND DDSHLT ;IF NOT HALTED THEN"gNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN************************ ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.2 - 18 JUL 82, Move DD to NNNNNNNNNNNNNNNNNN* QNNNNNNNNNNNNNNNNNNNNNNanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command source disk KNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNEF LIST OFF *INCLUDE MONBOARD.DEF *INCLUDE JDDCONT.DEF *INCLUDE JDDLOC.DEF *INCLUDE ISASI.DEF LIST ON ; ; MEMORY LOCAT٥NNNNNNNNNNNNNNNNNN*MONNNNNNNNNNNNNNNNNNNNN!+ BCDR0 ;STEP IN COMMAND STPIC EQU STPOC + BCDAS ;STEP OUT COMMAND SUBTTL MAIN PGM ORG PROMST ;-----------------------PHNNNNNNNNNNNNNNNNNNN*n@NNNNNNNNNNNNNNNNNNNNNNTOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (ROMSEL),A ; MONITOR ROM CONTINUES EXECUTION NOW ;--------------------NNNNNNNNNNNNNNNNNNN*!NNNNNNNNNNNNNNNNNNNNNN================ ; ; NOW VECTOR TO DISK BOOT ROUTINE ; ;====================================== LD A,(ARGSAV) AND 0F0H NNNNNNNNNNNNNNNNNN*'.NNNNNNNNNNNNNNNNNNNNN! & jumps to ; the BIOS cold start entry point. ; ;************************************************************* ; ; INJgNNNNNNNNNNNNNNNNNNN*-sNNNNNNNNNNNNNNNNNNNNN! WAIT JR NZ,WAIT ; ; SWITCH CONTROLLER MEMORY INTO SYSTEM BUS ; LD A,DDMRQ ;REQUEST MEMORY BANK 0 OUT (DDPORT),A ;̝NNNNNNNNNNNNNNNNNN*} NNNNNNNNNNNNNNNNNNNNNNhigh memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in case thurNNNNNNNNNNNNNNNNNN* ^NNNNNNNNNNNNNNNNNNNNNNoption. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allow boot from 2NNNNNNNNNNNNNNNNNNNNNNECT BOOT MODULE INTO CONTROLLER ; V 1.6 MOD TO RESET THE PROCESSOR TOO ; INJECT: LD A,DDMB0 + DDBGN ;REQUEST DD MEMORY BAN/NNNNNNNNNNNNNNNNNN*. NNNNNNNNNNNNNNNNNNNNN! ; CHECK FOR BOOT MALFUNCTION ; LD IX,(DADDR) LD BC,DDCBO ;ADD OFFSET TO IO BLOCK ADD IX,BC LD A,(IX + PBSTATO) ;ER4NNNNNNNNNNNNNNNNNN*N 1024 THEN SAVE EXCESS OR A PUSH BC PUSH HL POP BC POP HL SBC HL,BC PUSH HL ;SAVE ANY REMAINDER PUSH AF2rNNNNNNNNNNNNNNNNNN+iNNNNNNNNNNNNNNNNNNNNNNEN ABORT LD A,C OR B JR NZ,DKW2 DEC L OR L SCF ;RETURN ERROR TO CALLER JR Z,ABORT DKW2: IN A,(DDPORT) ;IFpNNNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNN------------------------- BADLDP: POP DE ;BALANCE STACK POP HL POP HL BADLD: RLCA ;IF DISK NOT READY THEN RETURN NC[NNNNNNNNNNNNNNNNNN+mNNNNNNNNNNNNNNNNNNNNNN********************************************************* ; ; THIS PART IS DESIGNED TO EXECUTE FROM LOCATION 0 OF THE ; DISKbYyNNNNNNNNNNNNNNNNNN+INNNNNNNNNNNNNNNNNNNNNNK DRIVE READY ; CALL STATUS - IMADR LD (8000H + DDCBO + PBSTATO),A ;PASS BACK TO SYSTEM AND DMDNR XOR A JP NZ,ERHLT |QdNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN STEP: CALL STATUS - IMADR ;GET 179X STATUS AND DMTK0 ;IF TRK 0 THEN DONE JR NZ,TRACK0 DEC L ;IF LAST TRACK THEN޼ NNNNNNNNNNNNNNNNNN+% ^NNNNNNNNNNNNNNNNNNNNNN LD (8000H + DDCBO + PBSTATO),A ;MAKE STATUS VISIBLE EX (SP),IY ;PUT RETURN ADDR ON STACK RETN ; ; SET UP FOR DCM R}NNNNNNNNNNNNNNNNNN++*QNNNNNNNNNNNNNNNNNNNNNN OR E JR NZ,RBYTE ;------------------------------------------------ ; ; TEST READ STATUS, TERMINATE OPERATION, GO DCM )JNNNNNNNNNNNNNNNNNNNN+/NNNNNNNNNNNNNNNNNNNNNN ;SAVE FLAGS JR C,LT1K ;IF CRY THEN < 1K LD BC,1024 JR MOVE1K ; LT1K: ADC HL,BC ;RESTORE COUNT PUSH HL POP BINNNNNNNNNNNNNNNNNN+yNNNNNNNNNNNNNNNNNNNNNN NOT DONE THEN WAIT AND DDSHLT JR NZ,DKWAIT LD A,DDMRQ ;IF ERROR THEN EXIT OUT (DDPORT),A LD A,(IX + PBSTATO) JRwNNNNNNNNNNNNNNNNNN+BNNNNNNNNNNNNNNNNNNNNNN CCF ; ; TIMOUT ENTRY (EXIT?) POINT ; ABORT: LD A,DDOUT ;REMOVE DD FROM MEMORY MAP BEFORE RETURN OUT (DDPORT),A \ NNNNNNNNNNNNNNNNNN+?NNNNNNNNNNNNNNNNNNNNNN CONTROLLER. ALL ABSOLUTE ADDRESSES MUST BE BIASED WITH ; NAME - IMADR. ; ;*************************************************UFmNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN- IMADR ;IF NOT READY THEN HALT ; ; PERFORM RECAL BY STEPPING IN UNTIL NOT 0 OR MAX TIMES THEN SEEKING ; TRACK 0. MODIFIED TZNNNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNN! ERROR JP Z,ERHOM - IMADR CALL STEPOT - IMADR ;STEP OUT UNTIL TRK 0 JR STEP ; ; LOAD HEAD ON SELECTED DRIVE ; T'NNNNNNNNNNNNNNNNNNN+&\ NNNNNNNNNNNNNNNNNNNNNNEAD OPERATION ; RDSET: LD DE,TMDBR ;DELAY BEFORE READ CALL TIMER - IMADR LD DE,BANKL ;SET LENGTH LD HL,BANK1 ;SET LTTNNNNNNNNNNNNNNNNNN+,NNNNNNNNNNNNNNNNNNNNNN ; ;------------------------------------------------ RTEST: IN A,(WDSTS) ;GET READ STATUS XOR C AND DMRER AND NOT CSBSɐNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!C MOVE1K: LD A,DDMB1 ;SWITCH TO MEMORY BANK 1 OUT (DDPORT),A LD HL,(DADDR) LDIR POP AF POP HL NXTSEC: JR C,BTF_NNNNNNNNNNNNNNNNNN+ JNNNNNNNNNNNNNNNNNNNNNN NZ,BADLDP LD A,DDMB1 OUT (DDPORT),A LD HL,(DADDR) ;MOVE SECTOR DOWN POP DE ;LAST BYTE PTR LD BC,SECSIZ LDIR BNNNNNNNNNNNNNNNNNN+sNNNNNNNNNNNNNNNNNNNNNN JP DKRET SUBTTL BOOTSTRAP INJECTION MODULE ;********************************************************* ; ; The bootstraNNNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNN*********** ; ; SET STACK, START DRIVE MOTOR & SET INVERT SWITCH (C) ; IMADR EQU $ LD SP,BANK1 IN A,XPMTX ;TURN ON?NNNNNNNNNNNNNNNNNNN+/NNNNNNNNNNNNNNNNNNNNNNO REQUIRE 2 CONSECUTIVE STEPS WITH NO TRACK 0. ; LD L,NBTRK ;MAX # STEPS = # TRACKS RECAL: DEC L ;IF MAX STEPS THEN ABNNNNNNNNNNNNNNNNNN+!ŚNNNNNNNNNNNNNNNNNNNNNNRACK0: LD A,C ;GET TRK 0 VALUE OUT (WDTRK),A ;SET TRACK REGISTER OUT (WDDTA),A ;SEEK SAME TRACK LD IY,RDSET - IMAM NNNNNNNNNNNNNNNNNN+'oNNNNNNNNNNNNNNNNNNNNN!p injection module is downloaded into the ; Double D memory by the previous system bootstrap driver. ; The module then reads iPNNNNNNNNNNNNNNNNNN+YNNNNNNNNNNNNNNNNNNNNNN MOTOR LD C,0 ;ASSUME 1793 IN A,(BLSTS) ;GET STATUS AND BSUS0 ;TEST USER SWITCH 0 JR NZ,SELECT ;GOTO SELECT DRIVnINNNNNNNNNNNNNNNNNN+SNNNNNNNNNNNNNNNNNNNNN!ORT JP Z,ERHOM - IMADR CALL STEPIN - IMADR ;STEP IN 1 CALL STATUS - IMADR ;IF ON TRK 0 THEN STEP IN UNTIL NOT 0 ANNNNNNNNNNNNNNNNNNNN+"NNNNNNNNNNNNNNNNNNNNNNDR ;SET NMI RETURN ADDR LD A,DCHDL ;OUTPUT HEAD LOAD COMMAND XOR C ;INVERT DATA OUT (WDCMD),A JR $ ;WAIT FOR INTERNNNNNNNNNNNNNNNNNN+(NNNNNNNNNNNNNNNNNNNNNN ;SET READ MULTI-SECTOR CMD XOR C OUT (WDCMD),A EX (SP),HL ;WAIT FOR 179X TO CATCH UP EX (SP),HL EX (SP),HL EX (1,yNNNNNNNNNNNNNNNNNN+.դNNNNNNNNNNNNNNNNNNNNNN------------------ ; ; READ ERROR HAS BEEN DETECTED ; ;-------------------------------------- ERRDA: LD A,BERDA ;SET REt$NNNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNND A,DDMRQ ;MAKE SURE IT'S READ COMMAND OUT (DDPORT),A LD A,DDRDS LD (IX + PBCMDO),A LD A,DDEXC ;START COMMAND OUT CHNNNNNNNNNNNNNNNNNNN+ ,NNNNNNNNNNNNNNNNNNNNN!----------------- ; ; TRANSFER CONTROL TO OS ; OS ENTRY IS ON STACK ; ;---------------------------- BTFINIS: LD A,DDOYNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNn the disk controller module (DCM) ; from track 0. ; The origin of this program is fixed, as it is assembled to ; execute insmNNNNNNNNNNNNNNNNNN+jNNNNNNNNNNNNNNNNNNNNNNE LD C,0FFH ;1791-01 INVERTS DATA BUS ; ; CLEAR 179X INTERRUPT & SELECT DRIVE 0 ; SELECT: CALL STATUS - IMADR mDNNNNNNNNNNNNNNNNNN+bNNNNNNNNNNNNNNNNNNNNNND DMTK0 JR NZ,RECAL DEC L JP Z,ERHOM - IMADR CALL STEPIN - IMADR ;STEP IN AGAIN CALL STATUS - IMADR ;IF 2ND STxNNNNNNNNNNNNNNNNNN+#NNNNNNNNNNNNNNNNNNNNNNRUPT ;************************************** ; ; DISK INTERRUPT VECTOR ROUTINE (NMI) ; ;*******************************7NNNNNNNNNNNNNNNNNN+)L3NNNNNNNNNNNNNNNNNNNNNNSP),HL ; ; ACCEPT EACH BYTE & STORE IN MEMORY ; RBYTE: IN A,(XPDSH) ;WAIT FOR DATA IN A,(WDDTA) ;GET & INVERT 1791fNNNNNNNNNNNNNNNNNN+/NNNNNNNNNNNNNNNNNNNNNNAD ERROR CODE & GO HALT JR ERHLT ;---------------------------- ; ; READ ERROR TYPE B ; ;---------------------------- EU7NNNNNNNNNNNNNNNNNN+ZNNNNNNNNNNNNNNNNNNNNNN(DDPORT),A EX (SP),HL ;ROTATE THUMBS EX (SP),HL LD HL,HNGTMO ;SET UP TIMOUT LD BC,0 DKWAIT: DEC BC ;IF TIMOUT THrNNNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNUT ;REMOVE DD FROM MEMORY MAP OUT (DDPORT),A RET ;---------------------------- ; ; ERROR HAS BEEN DETECTED ; ;---SdNNNNNNNNNNNNNNNNNN+\NNNNNNNNNNNNNNNNNNNNNNide the Double D. ; NOTE: Step timing and motor turn-on delays are defined in ; this module. Patching may be required. ; ;]NNNNNNNNNNNNNNNNNN+zNNNNNNNNNNNNNNNNNNNNNN;179X FORCED CLEAR LD A,BCDSE + BCDR0 + BCDAS ;DRIVE 0 ENABLED & DIRECTION IN OUT (BLCTL),A ;OUTPUT CONTROLS ; ; RC: CHECNNNNNNNNNNNNNNNNNNN+1NNNNNNNNNNNNNNNNNNNNNNEP TRK 0 THEN NOT FOUND TRK 1 AND DMTK0 JR NZ,RECAL ; ; POSITION HEAD TO TRK 0 ; HOME: LD L,NBTRK ;SET MAX TRKSNNNNNNNNNNNNNNNNNN+$:oNNNNNNNNNNNNNNNNNNNNNN******* DS NMINT + IMADR - $ ;PAD LOCATIONS TO NMI ADDR ; WDINT: IN A,(WDSTS) ;GET 179X STATUS XOR C ;INVERT 1791 NNNNNNNNNNNNNNNNNN+*`NNNNNNNNNNNNNNNNNNNNNN DATA XOR C LD (HL),A ;STORE DATA INC HL ;PTR +1 DEC DE ;LENGTH -1 LD A,D ;IF LENGTH NOT 0 THEN GET NEXT BYTE %/NNNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNNRRDB: LD A,BERDB JR ERHLT ;------------------------------------------------ ; ; COULD NOT FIND TRACK 0 PROPERLY ERROR NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅuD≱P[+ɒg6ԖrAN잻Y(ƣe4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+LNNNNNNNNNNNNNNNNNNNNNN ; ;------------------------------------------------ ERHOM: LD A,BEHOM ;HOME ERROR CODE ; ; SET ERROR CODE IN RAM IMAGErNNNNNNNNNNNNNNNNNN+^NNNNNNNNNNNNNNNNNNNNN!T MSINT: DEC A ;INNER LOOP JR NZ,MSINT DEC DE ;IF VALUE -1 = 0 THEN RETURN LD A,D OR E JR NZ,TIMER RET ;NNNNNNNNNNNNNNNNNN+ !NNNNNNNNNNNNNNNNNNNNNN ; ; Hard disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold star#EINNNNNNNNNNNNNNNNNN+]NNNNNNNNNNNNNNNNNNNNNN, ODD= 80H (128) LD A,(IOPB + PBSEC) ;IF ODD, THEN USE PLATTER 1 OR C LD (IOPB + PBSEC),A EXX CLRWT: IN A,(HSTATUS)p+dNNNNNNNNNNNNNNNNNN+~NNNNNNNNNNNNNNNNNNNNN!NZ IOPBLP ; ; FORCE HOST ADAPTER LOG-ON ; CALL EXIOPB ;LOGON DRIVE SCF JP NZ,DKRET LD A,RDCMD ;SET IOPB TO READNNNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNNIOPB + PBDMA) ;BUMP DMA ADDRESS ADD HL,DE LD (IOPB + PBDMA),HL DJNZ HDRDLP1 LD A,DDBGN ;INITIALIZE FDC & REMOVE WINndNNNNNNNNNNNNNNNNNN+%>nNNNNNNNNNNNNNNNNNNNNNN LD D,0 ADD HL,DE DEC HL ;FETCH BIOS LOAD ADDRESS LD D,(HL) DEC HL LD E,(HL) IF DEBUG LD DE,(ARG2) ;DEBUG2BNNNNNNNNNNNNNNNNNN++aNNNNNNNNNNNNNNNNNNNNNNALL EXIOPB SCF JP NZ,DKRET INC (IX + PBSEC) ;NEXT SECTOR LD HL,(IOPB + PBDMA) ;BUMP DMA ADDRESS ADD HL,DE LD (IO_9NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNE & HALT ; ERHLT: LD (8000H + DDCBO + PBSTATO),A ;DISPLAY ERROR CODE XOR A OUT (BLSTS),A ;DESELECT DRIVE IN A,(XPMT_TINNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNN********************************* ; ; STEP OUT 1 STEP SUBR ; ;********************************* STEPOT: LD A,STPOC ;ISSUE NNNNNNNNNNNNNNNNNN+rNNNNNNNNNNNNNNNNNNNNNNt entry point. ; ;************************************************************* HBOOT: LD A,1 SHL HRESET ;CLEAR CONTROLLER grNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN ;WAIT FOR CONTROLLER READY CP 0FFH ;IF NOT INSTALLED THEN QUIT JP Z,DKRET BIT HBUSYB,A ;ELSE WAIT JR NZ,CLRWT ; ; hNNNNNNNNNNNNNNNNNN++NNNNNNNNNNNNNNNNNNNNNN LD (IOPB + PBCMD),A CALL EXIOPB ;READ THE DIRECTORY SECTOR (IOPB SET UP) SCF JP NZ,DKRET ;======================AINNNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNDOW FROM MAP OUT (DDPORT),A IF $ >= 0FC00H CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF ;========TNNNNNNNNNNNNNNNNNNN+&k=NNNNNNNNNNNNNNNNNNNNN!, LOAD IN AT ARG 2 ENDIF LD (BIOSNT),DE ;SAVE START ADDRESS DEC HL ;FETCH BIOS LENGTH LD B,(HL) DEC HL LD C,(NNNNNNNNNNNNNNNNNN+,NNNNNNNNNNNNNNNNNNNNNNPB + PBDMA),HL LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP LD HL,(BIOSNT) ;BIOS LOADED, qNNNNNNNNNNNNNNNNNN+.NNNNNNNNNNNNNNNNNNNNNNO) ;MOTOR OFF HALT ;********************************* ; ; GET UPDATED 179X STATUS ; EXIT - A= 179X STATUS ; ;******NNNNNNNNNNNNNNNNNN+ }NNNNNNNNNNNNNNNNNNNNNNSTEP OUT COMMAND STEPC: OUT (BLCTL),A IN A,(XPSTP) ;ISSUE STEP PULSE LD DE,TMSTP ;SET DELAY JR TIMER ;**********NNNNNNNNNNNNNNNNNN+CNNNNNNNNNNNNNNNNNNNNNNFIRST OUT (HCMD),A XOR A OUT (HCMD),A LD A,DDOUT ;INSURE WINDOW REMOVED OUT (DDPORT),A LD HL,BASIOPB ;INIT IOPBvBNNNNNNNNNNNNNNNNNN+;NNNNNNNNNNNNNNNNNNNNNN WAIT A WHILE IN CASE G HOST ADAPTER FIDDLING WITH STATUS PORT ; LD HL,0 HB1: DEC HL LD A,H OR L JR NZ,HB1 ; ; ANNNNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN================ ; ; LOAD THE DCM FROM THE HARD DISK ; ;====================================== LD A,DDMB0 + DDBGN ;OPEN W0rNNNNNNNNNNNNNNNNNN+ (NNNNNNNNNNNNNNNNNNNNNN*********************** ; ; STEP IN 1 STEP SUBR ; ;********************************* STEPIN: LD A,STPIC ;ISSUE STEP IN COM_INNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN IN RAM LD DE,IOPB LD BC,IOPBSIZ LDIR LD A,(ARGSAV) ;COMPUTE & SET DRIVE AND 070H RRCA RRCA RRCA RRCA SUB NNNNNNNNNNNNNNNNNN+nNNNNNNNNNNNNNNNNNNNNNND CHECK AGAIN ; IN A,(HSTATUS) BIT HBUSYB,A ; ; IF BUSY AGAIN THEN CONTINUE TO WAIT ; JR NZ,CLRWT ; ; OUTPUT THEdNNNNNNNNNNNNNNNNNN+cNNNNNNNNNNNNNNNNNNNNNNINDOW TO LOAD DCM OUT (DDPORT),A LD A,(DEFBFR + 9) ;FETCH 1ST DCM SECTOR FROM DIRECTORY EXX ; SET UP PLATTER OR CaNNNNNNNNNNNNNNNNNN+"NNNNNNNNNNNNNNNNNNNNNN TO BUFFER LD (IOPB + PBDMA),HL LD A,(DEFBFR + 0BH) ;FETCH CBIOS SECTOR FROM DIRECTORY EXX OR C EXX LD (IOPB + PBS ,$NNNNNNNNNNNNNNNNNN+(H2NNNNNNNNNNNNNNNNNNNNNN;SET UP NEW DMA ADDRESS LD IX,IOPB ;POINT TO IOPB INC (IX + PBSEC) ;NEXT SECTOR LD HL,(BIOSLN) ;COMPUTE # SECTORS LNNNNNNNNNNNNNNNNNNN+.NNNNNNNNNNNNNNNNNNNNNN********************************* ; ; EXECUTE IOPB SUBR ; EXIT - ZF= NO ERRORS ; ;************************************** E9NNNNNNNNNNNNNNNNNN+8NNNNNNNNNNNNNNNNNNNNNN EX (SP),HL EX (SP),HL IN A,(WDSTS) ;GET STATUS XOR C RET ;********************************************** ; ; TxXNNNNNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNMAND JR STEPC IMSZE EQU $-IMADR ;THIS MUST BE LAST STATEMENT OF BIM SUBTTL HARD DISK BOOT IF $ >= 0FC00H CONMSG rNNNNNNNNNNNNNNNNNN+?NNNNNNNNNNNNNNNNNNNNNNA,4 ;BIAS DOWN LD (LOGINBY),A ;STORE DRIVE IN CP/M LOGIN BYTE FOR CBIOS RRA ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PBD!NNNNNNNNNNNNNNNNNN+]NNNNNNNNNNNNNNNNNNNNN! IOPB ADDRESS TO HOST ADAPTER ; LD B,03H ;3 BYTES TO XFER LD HL,IOPBADR IOPBLP: LD A,(HL) ;OUTPUT ADDRESS OUT (HDATAXNNNNNNNNNNNNNNNNNN+RNNNNNNNNNNNNNNNNNNNNNN EXX LD (IOPB + PBSEC),A LD HL,(DADDR) ;SET PTR LD (IOPB + PBDMA),HL LD B,8 ;SECTOR COUNT LD DE,SECSIZ HDRDLNNNNNNNNNNNNNNNNNN+#NNNNNNNNNNNNNNNNNNNNNNEC),A CALL EXIOPB ;LOAD IN CBIOS SECTOR #1 SCF ;CHECK FOR ERRORS JP NZ,DKRET LD A,(DEFBFR + 1) ;FETCH BIOS LOAD NNNNNNNNNNNNNNNNNN+){NNNNNNNNNNNNNNNNNNNNNND A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND 127 JR Z,NOBUMP LD DE,SECSIZ ADD HL,DE NOBUMP: LD A,L RLA ;PUT BIT 7vdNNNNNNNNNNNNNNNNNN+/ѥNNNNNNNNNNNNNNNNNNNNNNXIOPB: LD A,HEXEC ;EXECUTE IOPB OUT (HCMD),A EXIOPB1: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,EXIOPB1 AND (1 SHL HERRBNNNNNNNNNNNNNNNNNN+mNNNNNNNNNNNNNNNNNNNNN!IMER - WAIT FOR (DE * 1.0) MILLISECONDS ; ;********************************************** TIMER: LD A,247 ;SET LOOP CONSTANBNNNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNWARNING! Jade Double D code collides with DD Location! ENDIF ;************************************************************* `dNNNNNNNNNNNNNNNNNN+lNNNNNNNNNNNNNNNNNNNNNNRV),A RRA ;IF ODD DRIVE THEN SECTOR += 128 AND 80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD C,A ; EVEN= 0NNNNNNNNNNNNNNNNNN+MNNNNNNNNNNNNNNNNNNNNN!),A INC HL LD A,(HL) INC HL OUT (HCMD),A IOPBWT: IN A,(HSTATUS) ;WAIT FOR DONE BIT HBUSYB,A JR NZ,IOPBWT DJ*NNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNP1: CALL EXIOPB SCF ;IF ERROR THEN RETURN ERROR JP NZ,DKRET LD HL,IOPB + PBSEC ;NEXT SECTOR INC (HL) LD HL,(UNNNNNNNNNNNNNNNNNN+$ _NNNNNNNNNNNNNNNNNNNNN!PARAMETERS CP SECSIZ ;CHECK LIMITS OF OFFSET CCF JP C,DKRET LD HL,DEFBFR ;COMPUTE OFFSET TO CBIOS VECTORS LD E,A 0BNNNNNNNNNNNNNNNNNN+*.PNNNNNNNNNNNNNNNNNNNNNN INTO BIT 0 OF H RL H LD A,H DEC A ;ALREADY HAVE 1ST SECTOR LD (BIOSLN),A ;PUT INTO VAR LD (BIOSCNT),A HDRDLP: CNNNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNN) + (1 SHL HFERRB) ;CHECK FOR ERROR RET ;############################ ; ; BASE READ IOPB ; ;#########################6rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁl; مwF≱OY(ƒd3ϖm< ۚyH枵S"𢿣^-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,QNNNNNNNNNNNNNNNNNNNNNN### BASIOPB: DB LOGCMD ;COMMAND BYTE (LOGON 1ST) DB 0 ;DRIVE BYTE DW 0 ;TRACK WORD DW 2 ;SECTOR WORD (DIRECTORY SECNNNNNNNNNNNNNNNNNN,8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNECK FOR CONTROLLER PRESENT ; IN A,(?HSTATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX +(9NNNNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNNNB OUT (?HDATA),A LD A,?HIOPBH OUT (?HCMD),A CALL HWBUSY ; XOR A,A OUT (?HDATA),A LD A,?HIOPBX OUT (?HCMD),A C ~NNNNNNNNNNNNNNNNNN,mNNNNNNNNNNNNNNNNNNNNNN ;################################################ IOPBADR: DB LOW IOPB ;IOPB ADDRESS DB HIOPBL DB HIGH IOPB DB HIOPBH9NNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNCAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOPB + PB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; NNNNNNNNNNNNNNNNNN,~NNNNNNNNNNNNNNNNNNNNNND C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NNNNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNNN(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOPHNNNNNNNNNNNNNNNNNN,(./NNNNNNNNNNNNNNNNNNNNNN PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE DRIVE TO RESTOw)NNNNNNNNNNNNNNNNNNN,.NNNNNNNNNNNNNNNNNNNNNNALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,?HEXEC OUT (?HCMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; !BNNNNNNNNNNNNNNNNNN,^NNNNNNNNNNNNNNNNNNNNNN DB 0 DB HIOPBX IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END NNNNNNNNNNNNNNNNNNN, }NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNNNHARD DISK BOOT ;**************************************************************************** ; ; Hard disk boot function. ; Q NNNNNNNNNNNNNNNNNN,;NNNNNNNNNNNNNNNNNNNNNN RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD=INNNNNNNNNNNNNNNNNN,ONNNNNNNNNNNNNNNNNNNNN!NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TR9NNNNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNN! DEC A LD (BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;2%NNNNNNNNNNNNNNNNNN,)NNNNNNNNNNNNNNNNNNNNN!RE IOPB LATER SUB A,4 LD (IX + PB_DRVO),A ; ; TEMPORARILY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGEs9NNNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNN!POP BC LD (IX + PB_SECO),C LD (IX + PB_SECO + 1),B ; POP AF LD (IX + PB_DRVO),A ; ; RETURN THE ERROR STATUS ; LD/NNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN 7wNNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,qNNNNNNNNNNNNNNNNNNNNNNThis module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;**************\NNNNNNNNNNNNNNNNNN,+NNNNNNNNNNNNNNNNNNNNN! 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB NNNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD RNNNNNNNNNNNNNNNNNN,$kBNNNNNNNNNNNNNNNNNNNNNNIF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++(NNNNNNNNNNNNNNNNNN,*HMNNNNNNNNNNNNNNNNNNNNN!D ; LD C,(IX + PB_SECO) LD B,(IX + PB_SECO + 1) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (I;NNNNNNNNNNNNNNNNNN,0NNNNNNNNNNNNNNNNNNNNNN A,(IX + PB_STATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RESET THE CONTROLLER ; ISHACLR: LD A,1 SHL ?HRESET ;ISSU˳ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNŃj9ׅuD≱O퍼[*Ȓf5Ӗq@ߚ~M랺X'ţd3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,aNNNNNNNNNNNNNNNNNNNNNNE CONTROLLER RESET OUT (?HCMD),A XOR A,A OUT (?HCMD),A ; CLRWT: IN A,(?HSTATUS) ;WAIT FOR CONTROLLER READY BIT ?HBUSY1rNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ;d NNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD BIiNNNNNNNNNNNNNNNNNN,pNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENdNNNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT'NNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNCALL CRLF JP DSKERR SUBTTL ASCII CHAR ROUTINES ;*************************************************************************NNNNNNNNNNNNNNNNNN,%oCNNNNNNNNNNNNNNNNNNNNN!********************* CO: IN A,(?NTS) ;IF BUSY THEN WAIT AND A,1 SHL ?NTBSY JR NZ,CO ; LD A,C OUT (?NTD),A RET y"NNNNNNNNNNNNNNNNNN,+LLNNNNNNNNNNNNNNNNNNNNNN******************************* ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;********************************************************a!NNNNNNNNNNNNNNNNNN,2NNNNNNNNNNNNNNNNNNNNNNB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,NNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN IN A,(?HSTATUS) BIT ?HBUSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;++++++++++++++++++++++++++++++++++++++++BNNNNNNNNNNNNNNNNNN,_NNNNNNNNNNNNNNNNNNNNNN,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,SECSIZ LDքHNNNNNNNNNNNNNNNNNN,YNNNNNNNNNNNNNNNNNNNNNNTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;**************************************************************BNNNNNNNNNNNNNNNNNN,zNNNNNNNNNNNNNNNNNNNNNN - AF= /0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DBERR: ; ; DISPLAY HEADER ; NNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN*** ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;********************************************|9NNNNNNNNNNNNNNNNNN,&:NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;***dNNNNNNNNNNNNNNNNNN,,NNNNNNNNNNNNNNNNNNNNNN******************** SPACE: LD C,' ' JR CO SUBTTL ROM FUNCTIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++JKBNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNISHA2 ; IN A,(?HSTATUS) BIT ?HBUSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0NHNNNNNNNNNNNNNNNNNN, ,NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB{BNNNNNNNNNNNNNNNNNN,nNNNNNNNNNNNNNNNNNNNNN!IR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR [WNNNNNNNNNNNNNNNNNNN,jNNNNNNNNNNNNNNNNNNNNNN************** IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PB_SIZE LDIR RET ;++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN,INNNNNNNNNNNNNNNNNNNNNNLD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; PUSH IX POP HL LD B,PB_SIZE ; DBTE1: LD A,(HL) ;OUTPUT BYTE CALL vNNNNNNNNNNNNNNNNNN,!NNNNNNNNNNNNNNNNNNNNNN******************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ;!NNNNNNNNNNNNNNNNNN,' !NNNNNNNNNNNNNNNNNNNNNN************************************************************************* CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;***Cj9NNNNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN,ZNNNNNNNNNNNNNNNNNNNNN! ; AND A,(1 SHL ?HERRB) OR (1 SHL ?HFERRB) LD (IX + PB_STATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ;ʧNNNNNNNNNNNNNNNNNN, yNNNNNNNNNNNNNNNNNNNNNN PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ST NNNNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNN ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND 9 rNNNNNNNNNNNNNNNNNN,?NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; 9NNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNNHTOA ; CALL SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT NNNNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNNN ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA NNNNNNNNNNNNNNNNNN,(NNNNNNNNNNNNNNNNNNNNN!************************************************************************* ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAMHNNNNNNNNNNNNNNNNNNN,.NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ DKFUNC: ; ; IF ILLEGAL FUCTION THEN RETURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ;Pk9NNNNNNNNNNNNNNNNNN,iNNNNNNNNNNNNNNNNNNNNN! IN A,(?HDATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW OR A,A RET ;*****************************************NNNNNNNNNNNNNNNNNNN, JNNNNNNNNNNNNNNNNNNNNNNUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; CP AYNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNA,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H RL H LD A,H ; DECMCNNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNHL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DQERR: ; ; IF STATUS == 0 THEN RNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN# ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPA:*NNNNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNN LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;*********************************************************************KNNNNNNNNNNNNNNNNNN,)*.NNNNNNNNNNNNNNNNNNNNNNR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ; ;**************************************************************************** PUTS: NNNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNN! ; ELSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A6BNNNNNNNNNNNNNNNNNN, ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 G9NNNNNNNNNNNNNNNNNN-%.NNNNNNNNNNNNNNNNNNNNNNode for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISQ0NNNNNNNNNNNNNNNNNN-+ NNNNNNNNNNNNNNNNNNNNNN============================ ; ; CONSTANTS ; ;===========================================================================uBNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNRETVER ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAWNNNNNNNNNNNNNNNNNN-^}NNNNNNNNNNNNNNNNNNNNNN######################################################## ; ; LOGIN IOPB ; ;#################################################DNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN-cNNNNNNNNNNNNNNNNNNNNN! to high memory, clean up listing. ; ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in _NNNNNNNNNNNNNNNNNN-;lNNNNNNNNNNNNNNNNNNNNNN source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also alloNNNNNNNNNNNNNNNNNN- 2NNNNNNNNNNNNNNNNNNNNNNRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'jNNNNNNNNNNNNNNNNNN-&{NNNNNNNNNNNNNNNNNNNNNNHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy NNNNNNNNNNNNNNNNNN-,_NNNNNNNNNNNNNNNNNNNNNN= FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU ̣'NNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNXFUNC EQU ($ - FUNCTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSNNNNNNNNNNNNNNNNNN- mLNNNNNNNNNNNNNNNNNNNNNN########################### LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS tNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN-+RNNNNNNNNNNNNNNNNNNNNNNcase the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1.5 - 23 MAR 83 GRH ; Fix bug pNNNNNNNNNNNNNNNNNN-]NNNNNNNNNNNNNNNNNNNNN!w 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 ; 7 NNNNNNNNNNNNNNNNNN-!NNNNNNNNNNNNNNNNNNNNNNurns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; MպNNNNNNNNNNNNNNNNNN-'HNNNNNNNNNNNNNNNNNNNNNN ; Change ?xxx symbols to x_xx symbols. ; ; 3.07 30 NOV 88 GRH ; Remove 8" ISHA driver conversion of IOPB sector data from $NNNNNNNNNNNNNNNNNN--nNNNNNNNNNNNNNNNNNNNNNN128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE D$NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNION # ; EXIT - HL= VERSION # IN BINARY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVEBNNNNNNNNNNNNNNNNNN- 8NNNNNNNNNNNNNNNNNNNNNN DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 128 ;XFER COUNT DB 0,0,0,0 ;STATUS IF ($ < PROMST) OR ($ > (PROMST + PROMNNNNNNNNNNNNNNNNNN-ԧNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN-~NNNNNNNNNNNNNNNNNNNNNNin recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN2 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver funNNNNNNNNNNNNNNNNNN-"PNNNNNNNNNNNNNNNNNNNNNNodify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT lob!HNNNNNNNNNNNNNNNNNN-(XNNNNNNNNNNNNNNNNNNNNN!physical ; to logical sector (1..N -> 0..N-1). Corresponds with ISHA302. ; ; 3.08 27 JAN 89 GRH ; Change ROM swap point tXBNNNNNNNNNNNNNNNNNN-.=NNNNNNNNNNNNNNNNNNNNNNEFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZEBNNNNNNNNNNNNNNNNNN-(!NNNNNNNNNNNNNNNNNNNNNNR: LD HL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA ;###################################################################'NNNNNNNNNNNNNNNNNNN- .NNNNNNNNNNNNNNNNNNNNNNSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END sNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; NNNNNNNNNNNNNNNNNN-M0NNNNNNNNNNNNNNNNNNNNNNRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 iS+NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the fo9NNNNNNNNNNNNNNNNNN-#aNNNNNNNNNNNNNNNNNNNNNNader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new NNNNNNNNNNNNNNNNNN-)kNNNNNNNNNNNNNNNNNNNNNNo execute function entry. Was boot only. ; Also modify to allow AF value return. ; VERSN EQU 308 ; ;***********************9NNNNNNNNNNNNNNNNNN-/ NNNNNNNNNNNNNNNNNNNNN! OF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*MACLIB NNNNNNNNNNNNNNNNNN-}rNNNNNNNNNNNNNNNNNNNNNN######### ; ; MESSAGES ; ;############################################################################ DERM: DB CR,LF,'DiNNNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;******************************************************NNNNNNNNNNNNNNNNNN-]NNNNNNNNNNNNNNNNNNNNN!s ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the requЁNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNllowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F P$NNNNNNNNNNNNNNNNNN-$NNNNNNNNNNNNNNNNNNNNNNformat. ; ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; ; 3.06 26 SEP 88 GRH ; Add c4NNNNNNNNNNNNNNNNNN-*>NNNNNNNNNNNNNNNNNNNNN!***************************************************** SUBTTL DECLARATIONS ;================================================NNNNNNNNNNNNNNNNNN-0ANNNNNNNNNNNNNNNNNNNNNNASMBTOOL.MLB ;*INCLUDE ZMONROM.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEFrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNŃj9ׅwF䉳Q ],ʒh7ՖsBᚱOힼZ)ǣf5NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN ;*INCLUDE ISHA.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;===========================================================rNNNNNNNNNNNNNNNNNN-ysNNNNNNNNNNNNNNNNNNNNNN PGM ORG PROMST ;---------------------------------------------------------------------------- ; ; STAND-ALONE ENTRY VECTOR rNNNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNN*************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; ;***************************rNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN ;DISABLE ROM IMAGE OUT (M2_CLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS JR BEGIN ;-------NNNNNNNNNNNNNNNNNN-YNNNNNNNNNNNNNNNNNNNNN!BALANCER INC SP ; PUSH AF ;NEED A, PASS OUR ARG ON STACK ; LD A,MR_RNUM ;SELECT MONITOR FOR RETURN ; ; THE FOLLOWININNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN! ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST FOR IOPB EXECUTION ; LD A,D CPG9NNNNNNNNNNNNNNNNNN-%NNNNNNNNNNNNNNNNNNNNNN+ ; ; TEST IOPB STATUS FOR ERROR ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ZyNNNNNNNNNNNNNNNNNNN-+:NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ EX_IOPB: ; ; SWAP REGS ; PUSH HL POP IX ; ; EXECUTE NORMALLY ; CALL DSKX ; JR:^NNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN================= LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE NNNNNNNNNNNNNNNNNN-iMNNNNNNNNNNNNNNNNNNNNNN ; ;---------------------------------------------------------------------------- PHASECK DK_COLD JP COLD ;BOOT VECTOR zrNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN************************************************* PHASECK MR_CONOUT JP CO ;++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN-/SNNNNNNNNNNNNNNNNNNNNN!--------------------------------------------------------------------- ; ; SWAP ROMS BACK TO MONITOR ROM TO RETURN TO CALLER PRBNNNNNNNNNNNNNNNNNN- \NNNNNNNNNNNNNNNNNNNNNNG OUT INSTRUCTION MUST RESIDE AT 0F833H ; IF $ <> MR_XOVER CONMSG **** WARNING! Xover Address Mismatch! **** ENDIF %NNNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNN A,4 JP Z,EX_IOPB ; ; IF VERSION THEN EXIT ; CP A,1 JR C,RET_VER ; ; IF BOOT THEN EXIT ; JR Z,MBOOT ; ; IF!NNNNNNNNNNNNNNNNNN-&LNNNNNNNNNNNNNNNNNNNNN!+++++++++++++ TST_PB: ; ; PUT IN NORMAL REGS ; PUSH HL POP IX ; CALL DQERR ; JR DKRET ;++++++++++++++++++++NNNNNNNNNNNNNNNNNN-,oNNNNNNNNNNNNNNNNNNNNNN DKRET SUBTTL DISK BOOT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BOOT DISK FUNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON SUBTTL UNINITIALIZ*INNNNNNNNNNNNNNNNNN- Z|NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++ !NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DhiNNNNNNNNNNNNNNNNNNN-bNNNNNNNNNNNNNNNNNNNNNNOCEDURE ; ;---------------------------------------------------------------------------- DS MR_XOVER -$ - 5 ;POSITION CODE ;YNNNNNNNNNNNNNNNNNN-?mNNNNNNNNNNNNNNNNNNNNNNOUT (M2_RSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++CXNNNNNNNNNNNNNNNNNN-!3NNNNNNNNNNNNNNNNNNNNNN TEST IOPB THEN EXIT ; CP A,3 JR C,TST_PB ; ; IF DISPLAY DATA THEN EXIT ; JR Z,DIS_PB ; ; ELSE FUNCTION ERROR ;orNNNNNNNNNNNNNNNNNN-'NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- E:HL= IOPB PTR ; ;++++++++!NNNNNNNNNNNNNNNNNN--^NNNNNNNNNNNNNNNNNNNNN!CTION ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..FNNNNNNNNNNNNNNNNNN-, NNNNNNNNNNNNNNNNNNNNNNED DATA ;############################################################################ ; ; PAGE 0 RESERVED AREA ; ;#######rNNNNNNNNNNNNNNNNNN- /NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK MR_CONIN RET NOP NOP ;+++++++++++++NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_DSKX JP DSKX SN5NNNNNNNNNNNNNNNNNN-I1NNNNNNNNNNNNNNNNNNNNNN ; THESE STACK OPERATIONS ALLOW US TO PASS AN 'AF' VALUE BACK AND STILL BE ; ABLE TO USE THE 'A' REGISTER FOR THE 'OUT' INSTNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++ ; ; ROM FUNCTION DISPATCHER GETS CONTROL FROM MONITOR ROM WHICH EXECUTED ; CODE SIMILAR TO THE PREVIOUS FUNeBNNNNNNNNNNNNNNNNNN-"`NNNNNNNNNNNNNNNNNNNNNN LD A,-1 OR A,A SCF JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; REҞ$NNNNNNNNNNNNNNNNNN-(oNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIS_PB: ; ; PUT IN NORMAL REGS ; PUSH HL POP IX ֛NNNNNNNNNNNNNNNNNNNN-. NNNNNNNNNNNNNNNNNNNNNN = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; C= THIS ROM # ; ;++++++++++++++++++++++++++++++++++++++++++$NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!##################################################################### ORG 0040H ; ; BOOT VARIABLES ; PHASECK DK_PROM D>NNNNNNNNNNNNNNNNNNNN- <NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++NNNNNNNNNNNNNNNNNN-ЦNNNNNNNNNNNNNNNNNNNNNNUBTTL MAIN FUNCTIONS ;---------------------------------------------------------------------------- ; ; COLD START FROM RESET BNNNNNNNNNNNNNNNNNN-zNNNNNNNNNNNNNNNNNNNNNNRUCTION. ; THE MONITOR HAS ALREADY PUT A DUMMY VALUE ON THE STACK BEFORE IT'S 'OUT' ; INSTRUCTION IN ORDER TO MAINTAIN STACK B9MNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNCTION ; ENTRY- D= FUNCTION #: ; 0: RETURN VERSION # IN HL ; 1: BOOT DISK WITH ARGUMENT IN BC ; 2: TEST IOPB STATUS FORNNNNNNNNNNNNNNNNNN-#QNNNNNNNNNNNNNNNNNNNNNNTURN VERSION # FUNCTION ; EXIT - HL= VERSION # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNALANCE IN CASE THE SWAP DID NOT ; TAKE PLACE. THIS CODE REPLACES THAT VALUE WITH OURS. ; DKRET: INC SP ;SCRAP MONITOR STACK NNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN ERROR ; E:HL= PTR TO IOPB ; 3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB ; 4: EXECUTE IOPB ; E:HL= PTR TO IOPB ;8NNNNNNNNNNNNNNNNNN-$*NNNNNNNNNNNNNNNNNNNNNN+ RET_VER: LD HL,VERSN XOR A,A JR DKRET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9NNNNNNNNNNNNNNNNNN-* NNNNNNNNNNNNNNNNNNNNNNPB FUNCTION ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++irNNNNNNNNNNNNNNNNNN-0qNNNNNNNNNNNNNNNNNNNNNNXTRACT DRIVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS jNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNЁn= ۅyH扵S"_.̒k: ؖvE㚳Q \+ɣg6NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.9NNNNNNNNNNNNNNNNNNNNNN ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THENNNNNNNNNNNNNNNNNNN.՟NNNNNNNNNNNNNNNNNNNNN!;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++{ NNNNNNNNNNNNNNNNNN. :TNNNNNNNNNNNNNNNNNNNNNN++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL1rNNNNNNNNNNNNNNNNNN.(NNNNNNNNNNNNNNNNNNNNNN LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; _dNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COUNT !=NNNNNNNNNNNNNNNNNN._ENNNNNNNNNNNNNNNNNNNNNN THEN RETURN ERROR JP NC,JSELERR ; LD HL,DRVPRT ;CALULATE DRIVE PORT TABLE ELEMENT ADD A,L LD L,A LD A,0 ADC A,H 9NNNNNNNNNNNNNNNNNN.%NNNNNNNNNNNNNNNNNNNNNNTROLLER PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FU{NNNNNNNNNNNNNNNNNN.+NNNNNNNNNNNNNNNNNNNNNN LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(I 0 THEN XFER DATA ; OR A,C JR Z,JT1 ; LDIR ; ; LNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNNN.huNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROaoNNNNNNNNNNNNNNNNNN.%+NNNNNNNNNNNNNNNNNNNNNN; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ^NBNNNNNNNNNNNNNNNNNN.+$NNNNNNNNNNNNNNNNNNNNNN ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A R RNNNNNNNNNNNNNNNNNN.ZNNNNNNNNNNNNNNNNNNNNNN SEND SECTOR DATA DW JTYPE2 ;FORMAT TRACK " " " DW JTYPE1 ;READ ADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTPUTb#[NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN,PB_ILCMD ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET ;***************************************************S!BNNNNNNNNNNNNNNNNNN.X7NNNNNNNNNNNNNNNNNNNNNN CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNREMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JBNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DD_MB1 JT2A: O NNNNNNNNNNNNNNNNNN. }NNNNNNNNNNNNNNNNNNNNNNLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++1rNNNNNNNNNNNNNNNNNN.&xNNNNNNNNNNNNNNNNNNNNN!COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - 1NNNNNNNNNNNNNNNNNN.,8NNNNNNNNNNNNNNNNNNNNNNET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLBNNNNNNNNNNNNNNNNNN..kNNNNNNNNNNNNNNNNNNNNNN IOPB ONLY DW JTYPE4 ;EIA STATUS " " DW JTYPE4 ;IDLE " " DW JTYPE4 ;RETURN VERSION " " DW JTYPE5 ;SET DISK FLAG\NNNNNNNNNNNNNNNNNN. NNNNNNNNNNNNNNNNNNNNNN************************* ; ; ILLEGAL DRIVE REQUESTED ; ;*******************************************************************NNNNNNNNNNNNNNNNNN.kNNNNNNNNNNNNNNNNNNNNNN++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ;ZNNNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JP DSKERR ;++++++++++++BNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; NNNNNNNNNNNNNNNNNN.!NNNNNNNNNNNNNNNNNNNNNNN+++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A mNNNNNNNNNNNNNNNNNN.'INNNNNNNNNNNNNNNNNNNNNNAF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: ;BNNNNNNNNNNNNNNNNNN.- NNNNNNNNNNNNNNNNNNNNNNY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ;NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPE4 ;SEEK TRACK " " DW JTYPE5 ;SET DRIVE PARAMETE NNNNNNNNNNNNNNNNNN. NNNNNNNNNNNNNNNNNNNNNN********* JSELERR: LD (IX + PB_STATO),PB_ILCMD JP DSKERR ;************************************************************\NNNNNNNNNNNNNNNNNN.xKNNNNNNNNNNNNNNNNNNNNNN JT1A: EXX LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK$eNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXIT - A= 0 ; ;+++++++++++rNNNNNNNNNNNNNNNNNN.=&NNNNNNNNNNNNNNNNNNNNNN LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; ~NNNNNNNNNNNNNNNNNN."NNNNNNNNNNNNNNNNNNNNNN; ; COMPUTE OFFSET TO CDB ; PUSH HL EXX POP HL LD DE,DD_CBO ADD HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ;HNNNNNNNNNNNNNNNNNN.(wNNNNNNNNNNNNNNNNNNNNNN ; SELECT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX 'NNNNNNNNNNNNNNNNNNN..^NNNNNNNNNNNNNNNNNNNNNN B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++ \NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNRS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JTYPE4 ;SET EIA BAUD RATE " " DW JTYPE4 ;CLEAR ";NNNNNNNNNNNNNNNNNNN. NNNNNNNNNNNNNNNNNNNNNN**************** ; ; CONTROLLER NOT SENSED ERROR ; ;************************************************************************QrNNNNNNNNNNNNNNNNNN.KzNNNNNNNNNNNNNNNNNNNNN! 1) OUT (C),A ; ; FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO)]NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOR A,A RET ;++++++++++++++++++++++++++++++++++lNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN! IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT2 ;ÆrNNNNNNNNNNNNNNNNNN.#(NNNNNNNNNNNNNNNNNNNNNN PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES LDIR ; ; E NNNNNNNNNNNNNNNNNN.)FNNNNNNNNNNNNNNNNNNNNNN POP HL LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD 2dNNNNNNNNNNNNNNNNNN./mNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECTNNNNNNNNNNNNNNNNNN.ўNNNNNNNNNNNNNNNNNNNNNN " NJCMDS EQU ($ - JADETBL) / 2 ;**************************************************************************** ; ; ILLEGAW NNNNNNNNNNNNNNNNNN. >UNNNNNNNNNNNNNNNNNNNNNN**** JCNP: LD (IX + PB_STATO),PB_CNP JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[ NNNNNNNNNNNNNNNNNN.)NNNNNNNNNNNNNNNNNNNNNN LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; NNNNNNNNNNNNNNNNNN.[DNNNNNNNNNNNNNNNNNNNNNN LDIR ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++jdNNNNNNNNNNNNNNNNNN.$NNNNNNNNNNNNNNNNNNNNNNXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; c NNNNNNNNNNNNNNNNNN.*NNNNNNNNNNNNNNNNNNNNN!BC,PB_BCNTO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SIZE - PB_BCNTO ; ; UPLOAD STATUS BYTES ; LDIR`NNNNNNNNNNNNNNNNNN.0~NNNNNNNNNNNNNNNNNNNNNNIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? `NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNЁn= ۅyH扵S"_.͒k: ؖvE䚴R!𞿟],ʣh7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNN; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUWrNNNNNNNNNNNNNNNNNN/+NNNNNNNNNNNNNNNNNNNNN!ONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: [ NNNNNNNNNNNNNNNNNN/ LNNNNNNNNNNNNNNNNNNNNNNm ; address & jumps to the BIOS cold start entry point. ; ;******************************************************************1lNNNNNNNNNNNNNNNNNN/lNNNNNNNNNNNNNNNNNNNNNN SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LDNNNNNNNNNNNNNNNNNN/WNNNNNNNNNNNNNNNNNNNNNN LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIR$NNNNNNNNNNNNNNNNNN/)NNNNNNNNNNNNNNNNNNNNNN ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A BNNNNNNNNNNNNNNNNNN/%ïNNNNNNNNNNNNNNNNNNNNNN PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD HL,(IOPB + PB_DRVO) PUNNNNNNNNNNNNNNNNNN/+NNNNNNNNNNNNNNNNNNNNNN),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A NNNNNNNNNNNNNNNNNN/\NNNNNNNNNNNNNNNNNNNNNNTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++VNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNN!EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC,NNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN********** H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; PUSH BC LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 $NNNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNN (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD HL,(IOPB + PB_DRNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PRNNNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNNCNT > 0 ; HDRDLP5: LD A,(BIOSLN) OR A,A JR Z,HBRDDN ; CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SE  NNNNNNNNNNNNNNNNNN/ {NNNNNNNNNNNNNNNNNNNNNNBFR POP BC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; I(NNNNNNNNNNNNNNNNNN/[NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_NNNNNNNNNNNNNNNNNN0 OmNNNNNNNNNNNNNNNNNNNNNNT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++)9NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXXG#9NNNNNNNNNNNNNNNNNN0 sNNNNNNNNNNNNNNNNNNNNN!E ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;********NNNNNNNNNNNNNNNNNN0*|NNNNNNNNNNNNNNNNNNNNNN************* ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ; ;****************NNNNNNNNNNNNNNNNNN0!"NNNNNNNNNNNNNNNNNNNNNNN THEN RETURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ; ; ELSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LDA9NNNNNNNNNNNNNNNNNN0'jNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA $!NNNNNNNNNNNNNNNNNN0-ONNNNNNNNNNNNNNNNNNNNNNT DB 0,0,0,0 ;STATUS IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF NNNNNNNNNNNNNNNNNN091NNNNNNNNNNNNNNNNNNNNNNL RLA ;PUT BIT 7 INTO BIT 0 OF H RL H LD A,H ; DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (# $NNNNNNNNNNNNNNNNNN0 >NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++ DQERR: ; ; IF STATUS == 0 THEN RETURN NO ERROR ; LD A,(IX + PB_STATO) OR A,A RET Z ; ; E rNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX L>BNNNNNNNNNNNNNNNNNN0\ NNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ?>NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN************************************************************ PUTS: LD C,(HL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; pNNNNNNNNNNNNNNNNNN0"qNNNNNNNNNNNNNNNNNNNNNN A,C 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 EX (SP),HL RET ؊NNNNNNNNNNNNNNNNNN0(zNNNNNNNNNNNNNNNNNNNNNN;############################################################################ ; ; MESSAGES ; ;############################ BNNNNNNNNNNNNNNNNNN0.NNNNNNNNNNNNNNNNNNNNN!END ^NNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNN!BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;****************************************************************vNNNNNNNNNNNNNNNNNNN0 )NNNNNNNNNNNNNNNNNNNNN!LSE FALL INTO ERROR OUTPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY E,NNNNNNNNNNNNNNNNNN0ŷNNNNNNNNNNNNNNNNNNNNN!D A,L EXX CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR SUBTTL ASCII CHAR ROUTINES ;************(9NNNNNNNNNNNNNNNNNN0oNNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** CO: IN A,(NT_STAT) ;IF BUSY THEN WAIT AND5rNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!INC HL JR PUTS ;**************************************************************************** ; ; OUTPUT SPACE TO CONSOLW$NNNNNNNNNNNNNNNNNN0#@NNNNNNNNNNNNNNNNNNNNNN;############################################################################ ; ; FUNCTION TABLE ; ;########################ZxNNNNNNNNNNNNNNNNNN0)INNNNNNNNNNNNNNNNNNNNNN################################################ DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AH߽NNNNNNNNNNNNNNNNNN0/-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN0_SNNNNNNNNNNNNNNNNNNNNNN************ ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;*=NNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNRROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++ϤNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN**************************************************************** ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRYBNNNNNNNNNNNNNNNNNN0/NNNNNNNNNNNNNNNNNNNNNN A,1 SHL NT_BUSY JR NZ,CO ; LD A,C OUT (NT_DATA),A RET ;**********************************************************U9NNNNNNNNNNNNNNNNNN0ՉNNNNNNNNNNNNNNNNNNNNNNE SUBR ; ;**************************************************************************** SPACE: LD C,' ' JR CO SUBTTL ROMNNNNNNNNNNNNNNNNNN0$?NNNNNNNNNNNNNNNNNNNNNN#################################################### FUNCTBL: DW RETVER ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPBrNNNNNNNNNNNNNNNNNN0*NNNNNNNNNNNNNNNNNNNNN! AX ST S1 S2 S3 S4 S5 PT CA' DM CR,LF ;############################################################################ ; NNNNNNNNNNNNNNNNNN00`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅuD≱O퍼Z*Ȓf5Ӗq@N잻Y(ƣd3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; 9NNNNNNNNNNNNNNNNNN0[RNNNNNNNNNNNNNNNNNNNNNNRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 iS+rNNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the foNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new NNNNNNNNNNNNNNNNNN0{.NNNNNNNNNNNNNNNNNNNNNN******************************* SUBTTL DECLARATIONS ;======================================================================ONNNNNNNNNNNNNNNNNN0шNNNNNNNNNNNNNNNNNNNNNNE ZMONROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF \pNNNNNNNNNNNNNNNNNN0%;NNNNNNNNNNNNNNNNNNNNNNRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;--NNNNNNNNNNNNNNNNNN0+NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_FUNC JP DKFUNC ;***********************************************iNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;******************************************************$NNNNNNNNNNNNNNNNNN0KlNNNNNNNNNNNNNNNNNNNNNNs ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the requЁNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNllowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F PdNNNNNNNNNNNNNNNNNN0 rNNNNNNNNNNNNNNNNNNNNNNformat. ; ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; ; 3.06 26 SEP 88 GRH ; Add c4NNNNNNNNNNNNNNNNNN0.}NNNNNNNNNNNNNNNNNNNNN!====== ; ; CONSTANTS ; ;============================================================================ FALSE EQU 0 TRUE E[jdNNNNNNNNNNNNNNNNNN0 #NNNNNNNNNNNNNNNNNNNNNN;*INCLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;============================================================================ LINNNNNNNNNNNNNNNNNN0&nNNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;-----------------NNNNNNNNNNNNNNNNNN0,NNNNNNNNNNNNNNNNNNNNNN!***************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; ;*************************************************!NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN********************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; ; 1.1 - Fix bug. ; ; 1.2 - 18 JUL 82, Move DDINNNNNNNNNNNNNNNNNN0 x]NNNNNNNNNNNNNNNNNNNNNNest thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command}9NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN= 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 GNNNNNNNNNNNNNNNNNN0>CNNNNNNNNNNNNNNNNNNNNN!ode for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISQ0NNNNNNNNNNNNNNNNNNN0LNNNNNNNNNNNNNNNNNNNNNNQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZEBNNNNNNNNNNNNNNNNNN0!NNNNNNNNNNNNNNNNNNNNNNST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE !NNNNNNNNNNNNNNNNNN0']NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------- PHASECK DK_COLD JP COLD ;BOOT VECTOR ;+++++++++++++++++++[rNNNNNNNNNNNNNNNNNN0-NNNNNNNNNNNNNNNNNNNNNN*************************** PHASECK MR_CONOUT JP CO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2'NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN to high memory, clean up listing. ; ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in _rNNNNNNNNNNNNNNNNNN0 -NNNNNNNNNNNNNNNNNNNNNN source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allodNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'jNNNNNNNNNNNNNNNNNN0kNNNNNNNNNNNNNNNNNNNNN!HA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAULT FCB AS IOPB AREs*BNNNNNNNNNNNNNNNNNN0"ANNNNNNNNNNNNNNNNNNNNNNJDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON SUBTTL UNINITIALIZED DATA ;############NNNNNNNNNNNNNNNNNNN0(MNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++1HNNNNNNNNNNNNNNNNNNN0.,NNNNNNNNNNNNNNNNNNNNNN++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++NNNNNNNNNNNNNNNNNNNN0=0NNNNNNNNNNNNNNNNNNNNNNcase the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1.5 - 23 MAR 83 GRH ; Fix bug pNNNNNNNNNNNNNNNNNNN0 ?NNNNNNNNNNNNNNNNNNNNNNw 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 ; 7 NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNurns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; Mպ9NNNNNNNNNNNNNNNNNN0X!NNNNNNNNNNNNNNNNNNNNNN ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor function calls. All Rom ; functions are suNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE3BNNNNNNNNNNNNNNNNNN0#pNNNNNNNNNNNNNNNNNNNNN!################################################################ ; ; PAGE 0 RESERVED AREA ; ;#############################n NNNNNNNNNNNNNNNNNN0)~NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK MR_CONIN RET NOP NOP ;+++++++++++++++++++++++++++++++++++ENNNNNNNNNNNNNNNNNN0/NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_DSKX JP DSKX SUBTTL MAIN FUNCTIONS qNNNNNNNNNNNNNNNNNN0hcNNNNNNNNNNNNNNNNNNNNNNin recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GNNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNN!2 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver funNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNodify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT lob!rNNNNNNNNNNNNNNNNNN0HNNNNNNNNNNNNNNNNNNNNN!pported thru the Rom swap address from the Monitor ; Rom. ; VERSN EQU 306 ; ;*********************************************BNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN CHECKING ;============================================================================ ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDZNNNNNNNNNNNNNNNNNN0$NNNNNNNNNNNNNNNNNNNNNN############################################### ORG 0040H ; ; BOOT VARIABLES ; PHASECK DK_PROM DKPROM DS 2 ;PROM # & DsNNNNNNNNNNNNNNNNNN0*+NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++^NNNNNNNNNNNNNNNNNN00PNNNNNNNNNNNNNNNNNNNNNN;---------------------------------------------------------------------------- ; ; COLD START FROM RESET IN CASE THIS IS ONLY PJrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁn= ܅zI牶T#Ž`/͒k: ؖvE䚴R!𞿟],ʣh7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1pNNNNNNNNNNNNNNNNNNNNN!ROM IN SYSTEM ; ;---------------------------------------------------------------------------- COLD: DI ;DISABLE ROM IMAGE iyNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN!AP DID NOT ; TAKE PLACE. THIS CODE REPLACES THAT VALUE WITH OURS. ; DKRET: INC SP ;SCRAP MONITOR STACK BALANCER INC SP ; dNNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNN!R TO IOPB ; 3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB ; 4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; ;++++++++++++++++++j~NNNNNNNNNNNNNNNNNN1aNNNNNNNNNNNNNNNNNNNNNN,VERSN XOR A,A JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB S7INNNNNNNNNNNNNNNNNN1:NNNNNNNNNNNNNNNNNNNNN! FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++ $NNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN ; ; EXTRACT DRIVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORTNNNNNNNNNNNNNNNNNNNN1%zRNNNNNNNNNNNNNNNNNNNNNNF) SET ; ;---------------------------------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR9NNNNNNNNNNNNNNNNNN1+Y]NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;+++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNNN OUT (M2_CLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS JR BEGIN ;-----------------------------1p[NNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN PUSH AF ;NEED A, PASS OUR ARG ON STACK ; LD A,MR_RNUM ;SELECT MONITOR FOR RETURN ; ; THE FOLLOWING OUT INSTRUCTION MUSNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST FOR IOPB EXECUTION ; LD A,D CP A,4 JP Z,EX_IOPB 4NNNNNNNNNNNNNNNNNN1LNNNNNNNNNNNNNNNNNNNNN!TATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++YBNNNNNNNNNNNNNNNNNN1oNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ EX_IOPB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; ; EXECUTE NORMALLY ; CALL DRNNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN ; LD A,B OR A,A JR NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + LwNNNNNNNNNNNNNNNNNN1&/NNNNNNNNNNNNNNNNNNNNNN MESSAGE JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK$NNNNNNNNNNNNNNNNNN1,NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARDNNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------- ; ; SWAP ROMS BACK TO MONITOR ROM TO RETURN TO CALLER PROCEDURE ; ;---------:[NNNNNNNNNNNNNNNNNN1 9NNNNNNNNNNNNNNNNNNNNN!T RESIDE AT 0F833H ; IF $ <> MR_XOVER CONMSG **** WARNING! Xover Address Mismatch! **** ENDIF OUT (M2_RSEL),A ; ;]9NNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN; ; IF VERSION THEN EXIT ; CP A,1 JR C,RET_VER ; ; IF BOOT THEN EXIT ; JR Z,MBOOT ; ; IF TEST IOPB THEN EXIT BNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN!+++++ TST_PB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; CALL DQERR ; JR DKRET ;++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN1\NNNNNNNNNNNNNNNNNNNNNNSKX ; JP DKRET ;---------------------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPP!NNNNNNNNNNNNNNNNNN1!NNNNNNNNNNNNNNNNNNNNNN1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK NNNNNNNNNNNNNNNNNN1'0NNNNNNNNNNNNNNNNNNNNNN BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;++BNNNNNNNNNNNNNNNNNN1-NNNNNNNNNNNNNNNNNNNNNN PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIO)NNNNNNNNNNNNNNNNNN1ONNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------- DS MR_XOVER -$ - 5 ;POSITION CODE ; ; THESE STACK OPE`NNNNNNNNNNNNNNNNNN1 lNNNNNNNNNNNNNNNNNNNNN! MONITOR ROM CONTINUES EXECUTION NOW ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; $CNNNNNNNNNNNNNNNNNN12NNNNNNNNNNNNNNNNNNNNNN ; CP A,3 JR C,TST_PB ; ; IF DISPLAY DATA THEN EXIT ; JR Z,DIS_PB ; ; ELSE FUNCTION ERROR ; LD A,-1 OR A,A 6NNNNNNNNNNNNNNNNNN1*NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;++++++++++++BNNNNNNNNNNNNNNNNNN1_NNNNNNNNNNNNNNNNNNNNNNED ROMS & STARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 9NNNNNNNNNNNNNNNNNN1"NNNNNNNNNNNNNNNNNNNNNNTHEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8BNNNNNNNNNNNNNNNNNN1( NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;+++++++++++++++++KNNNNNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNN!S. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX ߬NNNNNNNNNNNNNNNNNN1|NNNNNNNNNNNNNNNNNNNNNNRATIONS ALLOW US TO PASS AN 'AF' VALUE BACK AND STILL BE ; ABLE TO USE THE 'A' REGISTER FOR THE 'OUT' INSTRUCTION. ; THE MONITXNNNNNNNNNNNNNNNNNNNN1 _NNNNNNNNNNNNNNNNNNNNNN ; ROM FUNCTION DISPATCHER GETS CONTROL FROM MONITOR ROM WHICH EXECUTED ; CODE SIMILAR TO THE PREVIOUS FUNCTION ; ENTRY- D= FUQ9NNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN SCF JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # FUNCTI(NNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIS_PB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; r NNNNNNNNNNNNNNNNNN1nNNNNNNNNNNNNNNNNNNNNNN5" JADE FLOPPY ; C..F = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; ;---------------------------------BNNNNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNNNOOT ; CP A,14H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;--------------NNNNNNNNNNNNNNNNNN1)??NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++CNNNNNNNNNNNNNNNNNN1/NNNNNNNNNNNNNNNNNNNNN!LD C,DD_PRT8 IN A,(C) AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCESNNNNNNNNNNNNNNNNNN1)NNNNNNNNNNNNNNNNNNNNNNOR HAS ALREADY PUT A DUMMY VALUE ON THE STACK BEFORE IT'S 'OUT' ; INSTRUCTION IN ORDER TO MAINTAIN STACK BALANCE IN CASE THE SWvNNNNNNNNNNNNNNNNNN1 ,NNNNNNNNNNNNNNNNNNNNNNNCTION #: ; 0: RETURN VERSION # IN HL ; 1: BOOT DISK WITH ARGUMENT IN BC ; 2: TEST IOPB STATUS FOR ERROR ; E:HL= PToNNNNNNNNNNNNNNNNNN1PNNNNNNNNNNNNNNNNNNNNNNON 0 ; EXIT - HL= VERSION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RET_VER: LD HLN NNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN CALL DBERR ; JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB dNNNNNNNNNNNNNNNNNN1=NNNNNNNNNNNNNNNNNNNNNN------------------------------------------- MBOOT: BEGIN: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A $NNNNNNNNNNNNNNNNNN1$IcNNNNNNNNNNNNNNNNNNNNN!-------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CRBNNNNNNNNNNNNNNNNNN1*jlNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;+++++++++++++++++++++++++++++++++++++++++++++0NNNNNNNNNNNNNNNNNN10NNNNNNNNNNNNNNNNNNNNNNSOR ; LD A,DD_BGN CALL JWAIT JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR,INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9؅vE㉲P[*Ȓf5Ӗq@ߚ~M랺X'ţc3nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1@NNNNNNNNNNNNNNNNNNNNNN ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),ANNNNNNNNNNNNNNNNNN1-NNNNNNNNNNNNNNNNNNNNNNSECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PBrNNNNNNNNNNNNNNNNNN1 -NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PB_DRVO) CP A,NDRVS ]-NNNNNNNNNNNNNNNNNN1QNNNNNNNNNNNNNNNNNNNNNN 4 ;8" MICROMATION DOUBLER DRIVES DB 1 ENDM JADE3: REPT 4 ;3" FLOPPY DRIVES DB DD_PRT3 ENDM NDRVS EQU $ - DRVPRT M?NNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN USE COMMAND TO INDEX INTO DRIVER TABLE ; LD A,(IX + PB_CMDO) ;IF UNSUPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDEvHNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN************************************************** ; ; ILLEGAL DRIVE REQUESTED ; ;******************************************E'NNNNNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFE69NNNNNNNNNNNNNNNNNN1KNNNNNNNNNNNNNNNNNNNNNN 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 NNNNNNNNNNNNNNNNNNN1 hNNNNNNNNNNNNNNNNNNNNNNPB EXECUTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION NNNNNNNNNNNNNNNNNN13NNNNNNNNNNNNNNNNNNNNNNE PORT TABLE ; DRVPRT: JADE8: REPT 4 ;8" FLOPPY DRIVES DB DD_PRT8 ENDM ISHA8: REPT 4 ;8" HARD DISK DRIVES DB ISH_STANNNNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNNN CONTROLLER PRESENT ; EXX IN A,(C) EXX INC A ;0FFH IF NOT THERE JR Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDREsdNNNNNNNNNNNNNNNNNN1^NNNNNNNNNNNNNNNNNNNNNN; JADEOK: LD (IX + PB_DRVO),A PUSH HL LD HL,JADERET EX (SP),HL JP (HL) ;EXECUTE THE DRIVER TYPE ; ; JADE ROUTINE`m9NNNNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNNNDW JTYPE5 ;SET DISK FLAGS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPE4 ;SEEK TRACK " " DW JTHNNNNNNNNNNNNNNNNNN1)NNNNNNNNNNNNNNNNNNNNN!********************************** JSELERR: LD (IX + PB_STATO),PB_ILCMD JP DSKERR ;***********************************NNNNNNNNNNNNNNNNNN1/NNNNNNNNNNNNNNNNNNNNNNR DATA FROM CONTROLLER ; JT1A: EXX LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDANNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNSECTOR INTO BUFFER ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST tNNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++dNNNNNNNNNNNNNNNNNN1`NNNNNNNNNNNNNNNNNNNNNNTUS ENDM JADE5: REPT 4 ;5" FLOPPY DRIVES DB DD_PRT5 ENDM ISHA5: REPT 4 ;5" HARD DISK DB ISH_STATUS ENDM MM8: REPTBrNNNNNNNNNNNNNNNNNN1>NNNNNNNNNNNNNNNNNNNNNNSS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE EXX LD H,A LD L,0 EXX ; ; NNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNN!S RETURN HERE ; JADERET: POP HL ;RESTORE DRIVE BUT SAVE FLAGS (ERROR) LD (IX + PB_DRVO),H RET ;###################INNNNNNNNNNNNNNNNNN1$~SNNNNNNNNNNNNNNNNNNNNN!YPE5 ;SET DRIVE PARAMETERS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JTYPE4 ;SET EIA BAUD RATE " pNNNNNNNNNNNNNNNNNNN1*]\NNNNNNNNNNNNNNNNNNNNNN***************************************** ; ; CONTROLLER NOT SENSED ERROR ; ;***********************************************LINNNNNNNNNNNNNNNNNN10NNNNNNNNNNNNNNNNNNNNNNOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; FETCH DESTINATION ADDRESSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNЁn= ܅zI牶T#`/Βl; ږxG暶T#_.̣j: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2+NNNNNNNNNNNNNNNNNNNNN! ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1n NNNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER BNNNNNNNNNNNNNNNNNN2 nNNNNNNNNNNNNNNNNNNNNNN ; OR A,C JR Z,JT2 ; LDIR ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;+++++++++++++++++++++++++++++++B NNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNNNT BYTES LDIR ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERR NNNNNNNNNNNNNNNNNN2vNNNNNNNNNNNNNNNNNNNNNN POP DE EX DE,HL LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SIZE - PB_BCNTO ; ; UPLONNNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNNSECTOR BUFFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO NiNNNNNNNNNNNNNNNNNNN2%NNNNNNNNNNNNNNNNNNNNNN; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC |NNNNNNNNNNNNNNNNNN2+NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; Hard disk boot function. ; This module reads the BIOS w9NNNNNNNNNNNNNNNNNN2~NNNNNNNNNNNNNNNNNNNNNN) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JRNNNNNNNNNNNNNNNNNN24NNNNNNNNNNNNNNNNNNNNNN ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+WNNNNNNNNNNNNNNNNNN2;NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER g)9NNNNNNNNNNNNNNNNNN2*NNNNNNNNNNNNNNNNNNNNN!OR THEN RETURN ERROR ; ; FALL INTO GET RESULTS FUNCTION ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN2%NNNNNNNNNNNNNNNNNNNNNNAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IXNNNNNNNNNNNNNNNNNN2 {NNNNNNNNNNNNNNNNNNNNNNERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 <(NNNNNNNNNNNNNNNNNN2&NNNNNNNNNNNNNNNNNNNNNNDE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L # NNNNNNNNNNNNNNNNNN2,[NNNNNNNNNNNNNNNNNNNNNNimage to the proper system ; address & jumps to the BIOS cold start entry point. ; ;***************************************** BNNNNNNNNNNNNNNNNNN2MNNNNNNNNNNNNNNNNNNNNNN Z,JT1 ; LDIR ; ; REMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAtNNNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WINDOW TO SECTOR BUFFER ; ENNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNWINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= C"NNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JALeNNNNNNNNNNNNNNNNNNNN2!-JNNNNNNNNNNNNNNNNNNNNNN;XFER DATA DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;+++++++++++++++++++++++++++++++++++yNNNNNNNNNNNNNNNNNN2'NNNNNNNNNNNNNNNNNNNNNN JP Z,DSKERR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF 9NNNNNNNNNNNNNNNNNN2-h'NNNNNNNNNNNNNNNNNNNNN!*********************************** H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC׶NNNNNNNNNNNNNNNNNN2YNNNNNNNNNNNNNNNNNNNNNNL IOPB FORMAT ERROR ; JT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JP NNNNNNNNNNNNNNNNNN2 VNNNNNNNNNNNNNNNNNNNNNNXX LD A,DD_MB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOU]NNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFRM'NNNNNNNNNNNNNNNNNNN2HNNNNNNNNNNNNNNNNNNNNNNONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN2^NNNNNNNNNNNNNNNNNNNNNNDE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; E2< NNNNNNNNNNNNNNNNNN2"xNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= POR& NNNNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNNN IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL MICROMATIONNNNNNNNNNNNNNNNNNNN2.=tNNNNNNNNNNNNNNNNNNNNNN C DJNZ H8B1 ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGIN9NNNNNNNNNNNNNNNNNN2hNNNNNNNNNNNNNNNNNNNNNNDSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXINNNNNNNNNNNNNNNNNNN2 gNNNNNNNNNNNNNNNNNNNNNNRCE ADDRESS FROM IOPB ; LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(IdNNNNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNN!ER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO CDB ; PUSH HL EXX POP HL LD DE,DD_CBO ADD HL,DE EX DE,HL ; ; NNNNNNNNNNNNNNNNNN2yNNNNNNNNNNNNNNNNNNNNNN++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN W\NNNNNNNNNNNNNNNNNN2mNNNNNNNNNNNNNNNNNNNNNNXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE9NNNNNNNNNNNNNNNNNN2#K(NNNNNNNNNNNNNNNNNNNNN!T OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)NNNNNNNNNNNNNNNNNN2)NNNNNNNNNNNNNNNNNNNNN!N PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++ NNNNNNNNNNNNNNNNNN2/ENNNNNNNNNNNNNNNNNNNNN!BYTE) ;COMPUTE & SET DRIVE SUB A,ISHA8 - DRVPRT ; ; IF 5" DRIVE THEN DO DIFFERENT ; CP A,ISHA8 - DRVPRT JP NC,HBOOT5 DNNNNNNNNNNNNNNNNNN2;NNNNNNNNNNNNNNNNNNNNNNT - A= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOR A,A RET ;+++++++++NNNNNNNNNNNNNNNNNN2 ]NNNNNNNNNNNNNNNNNNNNNNX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA }`dNNNNNNNNNNNNNNNNNN2}NNNNNNNNNNNNNNNNNNNNN!IOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PB_STATO ;ONLY XFER PERTINE?NNNNNNNNNNNNNNNNNN2GNNNNNNNNNNNNNNNNNNNNNNINDOW ; PUSH HL EXX POP HL LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX ԘNNNNNNNNNNNNNNNNNN28NNNNNNNNNNNNNNNNNNNNNN4: EQU JEX ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS NNNNNNNNNNNNNNNNNN2$ҿNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP #FNNNNNNNNNNNNNNNNNNN2*NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOT ;**********iNNNNNNNNNNNNNNNNNN20NNNNNNNNNNNNNNNNNNNNN! ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOPB + PaNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNŃj9؅vE㉳Q ],˒i8זuD㚳Q 𞿟],ʣh8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN!B_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAÑ$NNNNNNNNNNNNNNNNNN2:NNNNNNNNNNNNNNNNNNNNNNHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBF+NNNNNNNNNNNNNNNNNN2 YNNNNNNNNNNNNNNNNNNNNNNLD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) ;BIOrNNNNNNNNNNNNNNNNNN2yNNNNNNNNNNNNNNNNNNNNN! ; LD A,ID_SECT ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + P)NNNNNNNNNNNNNNNNNN2FNNNNNNNNNNNNNNNNNNNNNNB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INF':NNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STUPBIOS: ; ; NNNNNNNNNNNNNNNNNNN3![NNNNNNNNNNNNNNNNNNNNNNE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND A,7FH JR Z,NBNNNNNNNNNNNNNNNNNN3'XNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ; NNNNNNNNNNNNNNNNNN3-NNNNNNNNNNNNNNNNNNNNNN SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SParNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNND ; LD C,(IX + PB_SECO) LD B,(IX + PB_SECO + 1) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (I;NNNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNNRROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RESET THE CONTROLLER ; ISHACLR: LD A,1kNNNNNNNNNNNNNNNNNN3mZNNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------------------- ; ; 5" DRIVER ; ISHAX5: ; ; BIAS DOWN TO PHYSICAjNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ;**********************************************************crNNNNNNNNNNNNNNNNNN3(7NNNNNNNNNNNNNNNNNNNNN! FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; CP A,SECSIZ CCF ^NNNNNNNNNNNNNNNNNN3"NNNNNNNNNNNNNNNNNNNNN!OBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H RL H LD A,H ; DEC A ;ALREADY Hԡ$NNNNNNNNNNNNNNNNNN3(fNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DQERR: ; ; IF STATUS == 0 THEN RETURN NO ERROR5^NNNNNNNNNNNNNNNNNNN3.KNNNNNNNNNNNNNNNNNNNNNNACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUINNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNX + PB_SECO),C LD (IX + PB_SECO + 1),B ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; %NNNNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNN SHL ISH_RESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONNNNNNNNNNNNNNNNNNN3^kNNNNNNNNNNNNNNNNNNNNNNL DRIVE ; SUB A,ISHA5 - ISHA8 ADD A,4 ; ; STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD (IX + PB_DRVO),A ; ; PUT IOPB"NNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN****************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;**************tNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ;yZNNNNNNNNNNNNNNNNNN3#=NNNNNNNNNNNNNNNNNNNNNNAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;***********NNNNNNNNNNNNNNNNNN3)WNNNNNNNNNNNNNNNNNNNNNN ; LD A,(IX + PB_STATO) OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++++++++++++++++++++++g NNNNNNNNNNNNNNNNNN3/xNNNNNNNNNNNNNNNNNNNNNNTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXX CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JPCNNNNNNNNNNNNNNNNNN3ďNNNNNNNNNNNNNNNNNNNNNN; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; zNNNNNNNNNNNNNNNNNN3 +DNNNNNNNNNNNNNNNNNNNNNNTROLLER READY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HLE\NNNNNNNNNNNNNNNNNN3 8NNNNNNNNNNNNNNNNNNNNNN ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C c NNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN************************************************************** HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(ISH_STATBvNNNNNNNNNNNNNNNNNN3NUNNNNNNNNNNNNNNNNNNNNN! DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HLNNNNNNNNNNNNNNNNNN3$ NNNNNNNNNNNNNNNNNNNNNN***************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB NNNNNNNNNNNNNNNNNNN3*NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; pNNNNNNNNNNNNNNNNNN30kNNNNNNNNNNNNNNNNNNNNNN DSKERR SUBTTL ASCII CHAR ROUTINES ;**************************************************************************** ; ; CONVNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9օtCተM썻Y(ƒd3Җp?ޚ}L鞸V%ã`/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN3j(NNNNNNNNNNNNNNNNNNNNNNERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;**********************************************************?NNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN*********************************************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;**********rNNNNNNNNNNNNNNNNNN3 /ENNNNNNNNNNNNNNNNNNNNN!************* SPACE: LD C,' ' JR CO SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++MrNNNNNNNNNNNNNNNNNN39NNNNNNNNNNNNNNNNNNNNN! ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC E?NINNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN################################################# ; ; LOGIN IOPB ; ;########################################################g$NNNNNNNNNNNNNNNNNN3JTNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3% NNNNNNNNNNNNNNNNNNNNNNalibrate ; 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 !NNNNNNNNNNNNNNNNNN3+NNNNNNNNNNNNNNNNNNNNNNAlso ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRINNNNNNNNNNNNNNNNNN3?{NNNNNNNNNNNNNNNNNNNNNN****************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVNNNNNNNNNNNNNNNNNN3аNNNNNNNNNNNNNNNNNNNNNN****************************************************************** CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;**********-NNNNNNNNNNNNNNNNNN3zNNNNNNNNNNNNNNNNNNNNNN++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN!QU ($ - FUNCTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # 8WNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN#################### LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEI NNNNNNNNNNNNNNNNNN3 _NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3&YNNNNNNNNNNNNNNNNNNNNNN GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1 (PROMST + PROMSIZ)) BNNNNNNNNNNNNNNNNNN3!lNNNNNNNNNNNNNNNNNNNNN! TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; NNNNNNNNNNNNNNNNNN3'hNNNNNNNNNNNNNNNNNNNNNN.6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out t!NNNNNNNNNNNNNNNNNN3-)NNNNNNNNNNNNNNNNNNNNN!sk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives noNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN!UT ; ; FALL INTO CONSOLE OUTPUT ; ;**************************************************************************** ; ; rNNNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNNIT 7 SET) ; EXIT - HL, C, A= ? ; ;**************************************************************************** PUTS: LD C,(HINNNNNNNNNNNNNNNNNN3ZjNNNNNNNNNNNNNNNNNNNNNNLSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ANNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA ;##########################################################################dNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN CONMSG ERROR! Code Too Large for PROM! ENDIF END rNNNNNNNNNNNNNNNNNN3"9NNNNNNNNNNNNNNNNNNNNNN ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**********************NNNNNNNNNNNNNNNNNN3(VNNNNNNNNNNNNNNNNNNNNNNhat if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit al\BNNNNNNNNNNNNNNNNNN3.|NNNNNNNNNNNNNNNNNNNNNNw assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" JadNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNCONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;*********************************************************************NNNNNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNNL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; INC HL JR PUTS ;****************************************************Y9NNNNNNNNNNNNNNNNNN3i[NNNNNNNNNNNNNNNNNNNNNN INC HL LD H,(HL) LD L,A EX (SP),HL RET ;##########################################################################xINNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN## ; ; MESSAGES ; ;############################################################################ DERM: DB CR,LF,'Disk Erro39NNNNNNNNNNNNNNNNNN3,6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3# NNNNNNNNNNNNNNNNNNNNNN****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. :dNNNNNNNNNNNNNNNNNN3)gNNNNNNNNNNNNNNNNNNNNN!ong with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot optionn:9NNNNNNNNNNNNNNNNNN3/ONNNNNNNNNNNNNNNNNNNNNNe floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; NNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN******* CO: IN A,(NT_STAT) ;IF BUSY THEN WAIT AND A,1 SHL NT_BUSY JR NZ,CO ; LD A,C OUT (NT_DATA),A RET ;*****6NNNNNNNNNNNNNNNNNN3 tNNNNNNNNNNNNNNNNNNNNN!************************ ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;***************************************************************NNNNNNNNNNNNNNNNNN3<NNNNNNNNNNNNNNNNNNNNNN## ; ; FUNCTION TABLE ; ;############################################################################ FUNCTBL: DW RETVER hx9NNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNr! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5 PT CA' DM CR,LF ;###########################rNNNNNNNNNNNNNNNNNN3yeNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN3$;NNNNNNNNNNNNNNNNNNNNNN; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec ܅zI牶T#Ž`0Βl; ٖwF暶U$Ÿ`/ͣk: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN4 5NNNNNNNNNNNNNNNNNNNNNNH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 `NNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTa NNNNNNNNNNNNNNNNNN4 IXNNNNNNNNNNNNNNNNNNNNNNE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE HDISK.DEF *INCLUDE SYSDIR.DEF LIST ON SUBTTL UNINITIALIZED DATA ;############# *$NNNNNNNNNNNNNNNNNN4i$NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNORS ; BC,DE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JP DSKX ;#######5P$NNNNNNNNNNNNNNNNNN4,INNNNNNNNNNNNNNNNNNNNNN----------------------- ; ; SWAP ROMS TO RETURN TO CALLER ; ;---------------------------------------------------------------BNNNNNNNNNNNNNNNNNN4%NNNNNNNNNNNNNNNNNNNNNN LD A,C AND A,7 LD (DKPROM),A ; ; SAVE DRIVE ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; LD A,B ;CHECK Fo9NNNNNNNNNNNNNNNNNN4+NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET ;+++++++++++++0NNNNNNNNNNNNNNNNNN4YfNNNNNNNNNNNNNNNNNNNNNNJUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (remNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNE IOPB EQU 005CH ;USE DEFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800Hq\NNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNN!############################################################### ; ; PAGE 0 RESERVED AREA ; ;##############################6 NNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNN!++++++++++++ RET NOP NOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROMrNNNNNNNNNNNNNNNNNN4ӼNNNNNNNNNNNNNNNNNNNNNN##################################################################### ; ; PUT VERSION # AT START OF 1ST VECTOR FOR USER ACCESSדNNNNNNNNNNNNNNNNNN4 9NNNNNNNNNNNNNNNNNNNNN!------------- DS XOVER - $ ;POSITION CODE DKRET: LD A,XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION 8NNNNNNNNNNNNNNNNNN4&DNNNNNNNNNNNNNNNNNNNNNNOR DRIVE # > 0FFH OR A,A JR NZ,ABORT ; LD A,C ;TELL BIOS WHERE WE'RE AT LD (LOGINBYTE),A LD (DKPROM + 1),A ; ; N$NNNNNNNNNNNNNNNNNN4,|NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNN4jWNNNNNNNNNNNNNNNNNNNNNNoved DCM & BLT loader). ; VERSN EQU 303 ; ;**************************************************************************** sNNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNN! XOVER EQU PROMST + 30H ;ROM CROSS-OVER POINT PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===================LNINNNNNNNNNNNNNNNNNN4/:NNNNNNNNNNNNNNNNNNNNNN############################################## ORG 0040H ; ; BOOT VARIABLES ; DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOSDoNNNNNNNNNNNNNNNNNN4ÂNNNNNNNNNNNNNNNNNNNNN! FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JP DKFUNC81NNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN ; ;############################################################################ DW VERSN DB 0 ;---------------------rNNNNNNNNNNNNNNNNNN4! NNNNNNNNNNNNNNNNNNNNNN OUT (ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;-------------------------------------------------------------d9NNNNNNNNNNNNNNNNNN4'uNNNNNNNNNNNNNNNNNNNNNNOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JPNNNNNNNNNNNNNNNNNN4-ONNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;+++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN40 NNNNNNNNNNNNNNNNNNNNNN*************** JCNP: LD (IX + PBSTATO),CNPERR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++GrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNNNсo> ݅{J艷U$Ž`/͒k: ؖvE䚳Q \+ɣg7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN5zNNNNNNNNNNNNNNNNNNNNN!++++++++++++++ ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PNNNNNNNNNNNNNNNNNNN5'NNNNNNNNNNNNNNNNNNNNN!BDMAO + 1]) ; ; FETCH XFER COUNT ; LD C,(IX + PBST4O) LD B,(IX + PBST5O) ; ; CHECK FOR LEGAL COUNT ; LD A,B ;IFNNNNNNNNNNNNNNNNNN5 ?NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTRYNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNN!== 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; LDIR ;XFER DATA ; JT2: ; ; FALL INT$NNNNNNNNNNNNNNNNNN5[NNNNNNNNNNNNNNNNNNNNNNP HL ; ; DOWNLOAD THE IOPB ; LD BC,PBSTATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THE COMMAND ; LD A,DDEXC NNNNNNNNNNNNNNNNNN5ZNNNNNNNNNNNNNNNNNNNNNNDD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,PBSTATO ADD HL,BC EX DE,HL ; .NNNNNNNNNNNNNNNNNNNN5%NNNNNNNNNNNNNNNNNNNNNNG == TRUE THEN NO XFER JR NZ,JT2 ; ; SELECT CONTROLLER WINDOW ; EXX LD A,DDMB0 JP JT2A ;COMMON WITH WRITE SECTOR NNNNNNNNNNNNNNNNNN5+NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUTE Cb9NNNNNNNNNNNNNNNNNN5/NNNNNNNNNNNNNNNNNNNNN!TR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++bNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN COUNT == 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; LDIR ;XFER DATA ; ; REMOVE JADr]NNNNNNNNNNNNNNNNNN5jNNNNNNNNNNNNNNNNNNNNN!OLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++Ph NNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNN!O THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECdNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INTO GET RESULTS FUNCTION BNNNNNNNNNNNNNNNNNN5 OVNNNNNNNNNNNNNNNNNNNNNN; COUNT = REMAINDER ; LD BC,IOPBSZ - PBSTATO ; ; UPLOAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WINDOW ; EXX X=NNNNNNNNNNNNNNNNNN5&NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TOWrNNNNNNNNNNNNNNNNNN5, ;NNNNNNNNNNNNNNNNNNNNNN RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!NNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; CHECK FOR XFER INH)NNNNNNNNNNNNNNNNNN5 (NNNNNNNNNNNNNNNNNNNNNNE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL &A NNNNNNNNNNNNNNNNNN5YNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; CHECK FOR XFER INHIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THBNNNNNNNNNNNNNNNNNN56NNNNNNNNNNNNNNNNNNNNN!UTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRNNNNNNNNNNNNNNNNNN59NNNNNNNNNNNNNNNNNNNNNN ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNC!NNNNNNNNNNNNNNNNNN5!|gNNNNNNNNNNNNNNNNNNNNN!OR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + PBSTATO) OR A,A RET ;+++++++++++++++++++++++++++++++++ɟ9NNNNNNNNNNNNNNNNNN5'NNNNNNNNNNNNNNNNNNNNN!/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B,=NNNNNNNNNNNNNNNNNN5-9 NNNNNNNNNNNNNNNNNNNNNN++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF=NNNNNNNNNNNNNNNNNN5tNNNNNNNNNNNNNNNNNNNNNNIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; ; XFER DATA FROM CONTROLLER ; JT1A: EXX LdNNNNNNNNNNNNNNNNNN5 {NNNNNNNNNNNNNNNNNNNNNNJT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PBSTATO),IOPBERR ;PASS BACK ERROR JP DSKERR ;++++++++++++++++++++++++E1NNNNNNNNNNNNNNNNNN5JNNNNNNNNNNNNNNNNNNNNNNEN NO XFER JR NZ,JT2 ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DDMB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRkNNNNNNNNNNNNNNNNNN5eNNNNNNNNNNNNNNNNNNNNNNORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: ; ; OPEN WINDOWan NNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? dNNNNNNNNNNNNNNNNNN5")4NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 3 JADE COMMAND XFERS FORMAT PGM TO CONTROLLER ; ENTRY- IX= IOPB PTR ; NNNNNNNNNNNNNNNNNN5(NNNNNNNNNNNNNNNNNNNNNN DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++++++`'NNNNNNNNNNNNNNNNNNN5.lYNNNNNNNNNNNNNNNNNNNNNN 0: OK, /0: ERROR ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JWAIT: ; ; ?NNNNNNNNNNNNNNNNNN5ENNNNNNNNNNNNNNNNNNNNNND A,DDMB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A[NNNNNNNNNNNNNNNNNN5 JNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXIT - A= 0 ; ;+++++++++++++++++++++++NNNNNNNNNNNNNNNNNN5yNNNNNNNNNNNNNNNNNNNNNNESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; LD L,(IX + PBDMAO) LD H,(IX + [PBD$NNNNNNNNNNNNNNNNNN5TNNNNNNNNNNNNNNNNNNNNNN TO COMMAND BUFFER ; EXX LD A,DDMB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO CDB ; ڷNNNNNNNNNNNNNNNNNN5= (0FC00H AXNNNNNNNNNNNNNNNNNN5)NNNNNNNNNNNNNNNNNNNNN!*** H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; SET UP IONNNNNNNNNNNNNNNNNN5]NNNNNNNNNNNNNNNNNNNNNN ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,DDLOG LD (IOPB + PBCMDO),A A NNNNNNNNNNNNNNNNNN57NNNNNNNNNNNNNNNNNNNNNNRRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKR:rNNNNNNNNNNNNNNNNNN58NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(HSTATHNNNNNNNNNNNNNNNNNN5 xfNNNNNNNNNNNNNNNNNNNNN!,C OUT (HDATA),A LD A,HIOPBL OUT (HCMD),A CALL HWBUSY ; LD A,B OUT (HDATA),A LD A,HIOPBH OUT (HCMD),A CALL HWrNNNNNNNNNNNNNNNNNN5&NNNNNNNNNNNNNNNNNNNNN!TATUS PORT ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(HSTATUS) BIT HBUSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CsrNNNNNNNNNNNNNNNNNN5,= NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENlNNNNNNNNNNNNNNNNNNN5+NNNNNNNNNNNNNNNNNNNNN!ND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL MICROMATION PRIMITIVES ;++++++++++++++++~NNNNNNNNNNNNNNNNNN5 NNNNNNNNNNNNNNNNNNNNNNPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUBNNNNNNNNNNNNNNNNNN5nNNNNNNNNNNNNNNNNNNNNNN; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PBCMDO),DDRDS ; EXX LD A,B ьNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNET ; LD HL,(IOPB + PBSECO) ;NEXT SECTOR INC HL LD (IOPB + PBSECO),HL ; LD HL,(IOPB + PBDMAO) ;BUMP DMA ADDRESS LD DENNNNNNNNNNNNNNNNNNN5 NNNNNNNNNNNNNNNNNNNNN!US) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + PBCMDO) CP A,DDCLR JR Z,ISHACLR ; ; 2!NNNNNNNNNNNNNNNNNN5!KWNNNNNNNNNNNNNNNNNNNNNNBUSY ; XOR A,A OUT (HDATA),A LD A,HIOPBX OUT (HCMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,HzNNNNNNNNNNNNNNNNNN5'NNNNNNNNNNNNNNNNNNNNNNONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL HERRB) OR (1 SHL HFERRB) LD (IX + PBSTATO),A RET Z ; NNNNNNNNNNNNNNNNNN5-:NNNNNNNNNNNNNNNNNNNNNNTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++++++++++++++++++?NNNNNNNNNNNNNNNNNN5DNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++[NNNNNNNNNNNNNNNNNN5 KNNNNNNNNNNNNNNNNNNNNNN A,4 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOP NNNNNNNNNNNNNNNNNN5}NNNNNNNNNNNNNNNNNNNNN!EXX LD HL,?DIRSEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PBSECO),HL ; CALL ISHAX ;"NNNNNNNNNNNNNNNNNN5UNNNNNNNNNNNNNNNNNNNNNN,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ; SNNNNNNNNNNNNNNNNNN58NNNNNNNNNNNNNNNNNNNNNN BIAS DOWN DRIVE NUMBER ; LD A,(IX + PBDRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB A,4 LD (IX + PBDRVO),A ; BNNNNNNNNNNNNNNNNNN5"NNNNNNNNNNNNNNNNNNNNNNEXEC OUT (HCMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC LD (IX + PBSECO),C LD (IX + PBSECO + 1),B ; POP AFFHNNNNNNNNNNNNNNNNNN5(NNNNNNNNNNNNNNNNNNNNNN; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(HDATA) LD (IX + PBSTATO),A ;RETURN NO ERRORS FOR NOW OR A,A RET ANNNNNNNNNNNNNNNNNNN5.[iNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ; IF NOVNNNNNNNNNNNNNNNNNN5uNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOT ;******************************************xNNNNNNNNNNNNNNNNNNN5 zNNNNNNNNNNNNNNNNNNNNNNB + PBDRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX drNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN!READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; LOAD THE CBIOS ; LD HL,(DEFBFR + HDBIOSS) ;FETCH CNNNNNNNNNNNNNNNNNN5dNNNNNNNNNNNNNNNNNNNNNN LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP rNNNNNNNNNNNNNNNNNN5 NNNNNNNNNNNNNNNNNNNNN! ; TEMPORARILY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGED ; LD C,(IX + PBSECO) LD B,(IX + PBSECO + 1k rNNNNNNNNNNNNNNNNNN5#-5NNNNNNNNNNNNNNNNNNNNNN LD (IX + PBDRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PBSTATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RyNNNNNNNNNNNNNNNNNN5)NNNNNNNNNNNNNNNNNNNNN! ;**************************************************************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOESNNNNNNNNNNNNNNNNNN5/hXNNNNNNNNNNNNNNNNNNNNN!T IN 1ST SECTOR THEN RETURN ERROR ; CP A,SECSIZ CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD E,A nNNNNNNNNNNNNNNNNNN5&NNNNNNNNNNNNNNNNNNNNN!********************************** ; ; Hard disk boot function. ; This module reads the BIOS image to the proper system ; ad6NNNNNNNNNNNNNNNNNN5 ;NNNNNNNNNNNNNNNNNNNNNN ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,INNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNBIOS SECTOR FROM DIRECTORY LD H,0 INC HL ;CONVERT TO SECTOR FROM SECTOR -1 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B |dNNNNNNNNNNNNNNNNNN5ZNNNNNNNNNNNNNNNNNNNNNNDKRET ENDIF SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;+++++++++++++++++++++++++++++++++++++++++++++++++++f9NNNNNNNNNNNNNNNNNN5^NNNNNNNNNNNNNNNNNNNNNN) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (IX + PBSECO),C LD (IX + PBSECO + 1),B ; ; PUT _:NNNNNNNNNNNNNNNNNN5$NNNNNNNNNNNNNNNNNNNNNNESET THE CONTROLLER ; ISHACLR: LD A,1 SHL HRESET ;ISSUE CONTROLLER RESET OUT (HCMD),A XOR A,A OUT (HCMD),A ; CLRWT:wgNNNNNNNNNNNNNNNNNN5*NNNNNNNNNNNNNNNNNNNNNN NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;**************************************************************************** HWNNNNNNNNNNNNNNNNNN50{NNNNNNNNNNNNNNNNNNNNNN LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁn= ܅zI牶T#_.̒j9זuD㚲PZ)ǣe4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN6]NNNNNNNNNNNNNNNNNNNNNNFETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCg9NNNNNNNNNNNNNNNNNN6KNNNNNNNNNNNNNNNNNNNNNNNITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;*********************NNNNNNNNNNNNNNNNNN6 0NNNNNNNNNNNNNNNNNNNNNNFUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN6LNNNNNNNNNNNNNNNNNNNNNN***************************************** ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;******INNNNNNNNNNNNNNNNNN6kNNNNNNNNNNNNNNNNNNNNNN; LD A,C OUT (NTD),A RET ;**************************************************************************** ; ; NEW LIpNNNNNNNNNNNNNNNNNN6!NNNNNNNNNNNNNNNNNNNNNN******************************************************* SPACE: LD C,' ' JR CO SUBTTL ROM FUNCTIONS ;++++++++++++++++++++NNNNNNNNNNNNNNNNNNNN6%+NNNNNNNNNNNNNNNNNNNNNN################### FUNCTBL: DW RETVER ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBER NNNNNNNNNNNNNNNNNN6+pNNNNNNNNNNNNNNNNNNNNNNDM CR,LF ;############################################################################ ; ; LOGIN IOPB ; ;################py9NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNATION ; LD HL,DEFBFR LD BC,SECSIZ LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PBDMAO),DE ;SET UP NEW DMA ADDNNNNNNNNNNNNNNNNNN6[NNNNNNNNNNNNNNNNNNNNNN******************************************************* IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,IOPBSZ LDIR REg9NNNNNNNNNNNNNNNNNN6cNNNNNNNNNNNNNNNNNNNNNN++ DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; PUSH IX POP HL LD B,IOPBSZ ; )|$NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN********************************************************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRNNNNNNNNNNNNNNNNNN6>NNNNNNNNNNNNNNNNNNNNNNNE SUBR ; EXIT - AF, C= ? ; ;**************************************************************************** CRLF: LD C,0DH C3'NNNNNNNNNNNNNNNNNN6 ԊNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; ;++++++++++++++++]NNNNNNNNNNNNNNNNNN6&~,NNNNNNNNNNNNNNNNNNNNNNR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC EQU ($ - FUNCTBL) / 2 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>\NNNNNNNNNNNNNNNNNN6,NNNNNNNNNNNNNNNNNNNNNN############################################################ LOGIOPB: DB DDLOG ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW 2\NNNNNNNNNNNNNNNNNN6?NNNNNNNNNNNNNNNNNNNNNNRESS ; INC (IX + PBSECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,PHNNNNNNNNNNNNNNNNNN6 hNNNNNNNNNNNNNNNNNNNNNNT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= OBNNNNNNNNNNNNNNNNNN6RNNNNNNNNNNNNNNNNNNNNN!DBTE1: LD A,(HL) ;OUTPUT BYTE CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DOQNNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,9emNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNALL CO LD C,0AH JR CO ;**************************************************************************** ; ; PRINT TEXT SUBNNNNNNNNNNNNNNNNNN6!NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DKFUNC: ; ; IF ILLEGAL FUCTION THEN RETURN ERROR ; LD A,C jrNNNNNNNNNNNNNNNNNN6'MNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; ; RETURN VERSION # ; EXIT - HL= VERSION # IN BINARY ; ;++++++++++++++++++++++++++++++++++++++++++++++++Ӆ NNNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNN! ;SECTOR/SIDE DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DB 0,0,0,0 ;STATUS DW 128 ;XFER COUNT IF ($ < NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNL ;IF NOT EVEN SECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7GNNNNNNNNNNNNNNNNNN6 =NNNNNNNNNNNNNNNNNNNNNNIOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++INNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!NE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA ; ; DI]NNNNNNNNNNNNNNNNNN6{NNNNNNNNNNNNNNNNNNNNNN0H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;*******************************( NNNNNNNNNNNNNNNNNN6rNNNNNNNNNNNNNNNNNNNNNNBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ; ;*************************************************NNNNNNNNNNNNNNNNNN6"NNNNNNNNNNNNNNNNNNNNNN CP A,MAXFUNC LD A,-1 RET NC ; ; ELSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LD A,C ADD A,A ADD A,L LD L,Av NNNNNNNNNNNNNNNNNN6(]#NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++ RETVER: LD HL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA ;################################'NNNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNPROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END NNNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNNN INTO BIT 0 OF H RL H LD A,H ; DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DO.NNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNN++ DQERR: ; ; IF STATUS == 0 THEN RETURN NO ERROR ; LD A,(IX + PBSTATO) OR A,A RET Z ; ; ELSE FALL INTO ERROR OUirNNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNSPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXX CALL HTOA3BNNNNNNNNNNNNNNNNNN6HNNNNNNNNNNNNNNNNNNNNNN********************************************* ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;*****************NNNNNNNNNNNNNNNNNN6CNNNNNNNNNNNNNNNNNNNNNN*************************** PUTS: LD C,(HL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; INC HL JR PUTS ;**********jNNNNNNNNNNNNNNNNNN6#NNNNNNNNNNNNNNNNNNNNN! LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ;################################NNNNNNNNNNNNNNNNNN6)nNNNNNNNNNNNNNNNNNNNNNN############################################ ; ; MESSAGES ; ;############################################################# NNNNNNNNNNNNNNNNNN6/ĴNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6xNNNNNNNNNNNNNNNNNNNNNNNE, RETURN NO ERROR ; OR A,A RET ;**************************************************************************** ; ; INNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNN!TPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR ~NNNNNNNNNNNNNNNNNN6}NNNNNNNNNNNNNNNNNNNNNN ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR SUBTTL ASCII CHAR ROUTINES ;***********************************NNNNNNNNNNNNNNNNNN6XNNNNNNNNNNNNNNNNNNNNNN*********************************************************** CO: IN A,(NTS) ;IF BUSY THEN WAIT AND A,1 SHL NTBSY JR NZ,CO NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;*********************NNNNNNNNNNNNNNNNNN6$NNNNNNNNNNNNNNNNNNNNNNN############################################ ; ; FUNCTION TABLE ; ;#########################################################%NNNNNNNNNNNNNNNNNN6*;ANNNNNNNNNNNNNNNNNNNNNN############### DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5 PT CA' NNNNNNNNNNNNNNNNNN60NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅuD≱O[+ɒg6ԖsBᚱOힼZ)ǣe4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN6mNNNNNNNNNNNNNNNNNNNNN! TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; BNNNNNNNNNNNNNNNNNN6|NNNNNNNNNNNNNNNNNNNNNNRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 iS+NNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the foNNNNNNNNNNNNNNNNNN6|NNNNNNNNNNNNNNNNNNNNNNader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new NNNNNNNNNNNNNNNNNN6\NNNNNNNNNNNNNNNNNNNNNN********************************************** SUBTTL DECLARATIONS ;=======================================================rNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUD^PrNNNNNNNNNNNNNNNNNN6%ONNNNNNNNNNNNNNNNNNNNNN#### ORG 0040H ; ; BOOT VARIABLES ; PHASECK DK_PROM DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENG])NNNNNNNNNNNNNNNNNN6+?@NNNNNNNNNNNNNNNNNNNNNNION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_FUNCBNNNNNNNNNNNNNNNNNN6>NNNNNNNNNNNNNNNNNNNNNN ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;******************************************************NNNNNNNNNNNNNNNNNN6lNNNNNNNNNNNNNNNNNNNNN!s ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the requЁBNNNNNNNNNNNNNNNNNN6SNNNNNNNNNNNNNNNNNNNNNNllowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F PrNNNNNNNNNNNNNNNNNN6*NNNNNNNNNNNNNNNNNNNNN!format. ; ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; ; 3.06 26 SEP 88 GRH ; Add c4NNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNN!===================== ; ; CONSTANTS ; ;============================================================================ FALSwMHNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;============================================================================ LIST OFF @NNNNNNNNNNNNNNNNNN6&INNNNNNNNNNNNNNNNNNNNNNTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;---------------------------------------------8NNNNNNNNNNNNNNNNNN6,NNNNNNNNNNNNNNNNNNNNN! JP DKFUNC ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN********************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; ; 1.1 - Fix bug. ; ; 1.2 - 18 JUL 82, Move DDdNNNNNNNNNNNNNNNNNN6 _NNNNNNNNNNNNNNNNNNNNNNest thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command}rNNNNNNNNNNNNNNNNNN6bNNNNNNNNNNNNNNNNNNNNN!= 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 GrNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNode for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISQ0HNNNNNNNNNNNNNNNNNNN6:NNNNNNNNNNNNNNNNNNNNNNE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DJm9NNNNNNNNNNNNNNNNNN6!ЋNNNNNNNNNNNNNNNNNNNNNN*INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF*~NNNNNNNNNNNNNNNNNN6'z-NNNNNNNNNNNNNNNNNNNNNN------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;------------------------------------------------------------_BNNNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNNNRY- C= CHAR ; ;**************************************************************************** JP CO ;++++++++++++++++++++HNNNNNNNNNNNNNNNNNN6)NNNNNNNNNNNNNNNNNNNNNN to high memory, clean up listing. ; ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in _NNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNN! source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allorNNNNNNNNNNNNNNNNNN6/NNNNNNNNNNNNNNNNNNNNNNRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'jNNNNNNNNNNNNNNNNNN6LNNNNNNNNNNNNNNNNNNNNNNHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy $NNNNNNNNNNNNNNNNNN6BNNNNNNNNNNNNNNNNNNNNN!ISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAULT UNNNNNNNNNNNNNNNNNNN6"NNNNNNNNNNNNNNNNNNNNN! *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON PHASECK MACRO #NAME IF $ <> #NAME CONMSG **** Phase Error - #NAME Not) NNNNNNNNNNNNNNNNNN6(jNNNNNNNNNNNNNNNNNNNNNN---------------- PHASECK DK_COLD JP COLD ;BOOT VECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++?!NNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AZZ'NNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNcase the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1.5 - 23 MAR 83 GRH ; Fix bug pNNNNNNNNNNNNNNNNNNNN6 9NNNNNNNNNNNNNNNNNNNNN!w 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 ; 7 NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; MպNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN ; Change ?xxx symbols to x_xx symbols. ; ; 3.07 30 NOV 88 GRH ; Remove 8" ISHA driver conversion of IOPB sector data from $rNNNNNNNNNNNNNNNNNN6sNNNNNNNNNNNNNNNNNNNNN!FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THINNNNNNNNNNNNNNNNNN6#NNNNNNNNNNNNNNNNNNNNNN Equal to *ROM.DEF **** ENDIF ENDM SUBTTL UNINITIALIZED DATA ;#######################################################NNNNNNNNNNNNNNNNNN6)Y"NNNNNNNNNNNNNNNNNNNNN!++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)BNNNNNNNNNNNNNNNNNN6/NNNNNNNNNNNNNNNNNNNNNNF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DH NNNNNNNNNNNNNNNNNN6ONNNNNNNNNNNNNNNNNNNNNNin recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GBNNNNNNNNNNNNNNNNNN6 1NNNNNNNNNNNNNNNNNNNNNN2 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver funNNNNNNNNNNNNNNNNNN6MNNNNNNNNNNNNNNNNNNNNNNodify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT lob!NNNNNNNNNNNNNNNNNN6oNNNNNNNNNNNNNNNNNNNNNNphysical ; to logical sector (1..N -> 0..N-1). Corresponds with ISHA302. ; VERSN EQU 307 ; ;******************************oBNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNS PROM FOR CODE CHECKING ;============================================================================ ; ;*INCLUDE ZMONROrNNNNNNNNNNNNNNNNNN6$/~NNNNNNNNNNNNNNNNNNNNNN##################### ; ; PAGE 0 RESERVED AREA ; ;########################################################################NNNNNNNNNNNNNNNNNN6* qNNNNNNNNNNNNNNNNNNNNNN++++++ RET NOP NOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTDNNNNNNNNNNNNNNNNNN60NNNNNNNNNNNNNNNNNNNNN!K_DSKX JP DSKX SUBTTL MAIN FUNCTIONS ;---------------------------------------------------------------------------- ; ZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNсo> ܅zI艷U$Ž`0Βl; ٖwF嚴S"^.̣j9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;--------------------------------------------------------------- `NNNNNNNNNNNNNNNNNNN7=ONNNNNNNNNNNNNNNNNNNNNNTARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOL` NNNNNNNNNNNNNNNNNN7 ҄NNNNNNNNNNNNNNNNNNNNNN ;IF 5" HARD DISK THEN EXIT JP C,H8BOOT ; CP A,14H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THJoNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++V NNNNNNNNNNNNNNNNNN73NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,DD_PRT8 IN A,(C) AND A,DD_NNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNOR ; LD A,(DEFBFR) CP A,86H JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + BD_SIOSS) LD A*HNNNNNNNNNNNNNNNNNN7%]NNNNNNNNNNNNNNNNNNNNNN EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ENDIF SUBTTL DISK IOPB EXECUTOR ;+++++++++++++++++++++mNNNNNNNNNNNNNNNNNN7+~NNNNNNNNNNNNNNNNNNNNNNMICROMATION THEN EXIT JP Z,M2X ; JP JADEX ;ELSE MUST BE JADE CONTROLLER ; ; ; DRIVE PORT TABLE ; DRVPRT: JADE8: RELBNNNNNNNNNNNNNNNNNN7ºNNNNNNNNNNNNNNNNNNNNN!------------- COLD: DI ;DISABLE ROM IMAGE OUT (M2_CLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS eSNNNNNNNNNNNNNNNNNN7-qNNNNNNNNNNNNNNNNNNNNNNPPY ; C..F = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; ;--------------------------------------------9NNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;-------------------------------------------------NNNNNNNNNNNNNNNNNN7koNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++gNNNNNNNNNNNNNNNNNN7H`NNNNNNNNNNNNNNNNNNNNNNSASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCESSOR ; LD A,DD_BGN CALL JWAIT {NNNNNNNNNNNNNNNNNN7 >NNNNNNNNNNNNNNNNNNNNNN,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CALL DSKX '!NNNNNNNNNNNNNNNNNN7&NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; EXIT ENNNNNNNNNNNNNNNNNN7,SNNNNNNNNNNNNNNNNNNNNNNPT 4 ;8" FLOPPY DRIVES DB DD_PRT8 ENDM ISHA8: REPT 4 ;8" HARD DISK DRIVES DB ISH_STATUS ENDM JADE5: REPT 4 ;5" FLOPNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN JR BEGIN ;---------------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLEXNNNNNNNNNNNNNNNNNN7 @NNNNNNNNNNNNNNNNNNNNNN-------------------------------- BEGIN: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_RNUM),A ; ; EXTRACT DRIINNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN--------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;-----------------------BNNNNNNNNNNNNNNNNNN7X^NNNNNNNNNNNNNNNNNNNNN!+++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M84NNNNNNNNNNNNNNNNNNN7{QNNNNNNNNNNNNNNNNNNNNNN JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE *[NNNNNNNNNNNNNNNNNN7!NNNNNNNNNNNNNNNNNNNNNN CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKw)NNNNNNNNNNNNNNNNNN7';NNNNNNNNNNNNNNNNNNNNN!- AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++jNNNNNNNNNNNNNNNNNN7-bNNNNNNNNNNNNNNNNNNNNNNPY DRIVES DB DD_PRT5 ENDM ISHA5: REPT 4 ;5" HARD DISK DB ISH_STATUS ENDM MM8: REPT 4 ;8" MICROMATION DOUBLER DRIVES kNNNNNNNNNNNNNNNNNN7hNNNNNNNNNNNNNNNNNNNNN!R ; ;---------------------------------------------------------------------------- DS MR_XOVER - $ ;POSITION CODE DKRET: LDVNNNNNNNNNNNNNNNNNN7 KNNNNNNNNNNNNNNNNNNNNNNVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,frNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNN!----------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET ;+++++++++NNNNNNNNNNNNNNNNNN7 NNNNNNNNNNNNNNNNNNNNNNBOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++QNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNIOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,2 ;SET SECTOR LD (IOP˳!NNNNNNNNNNNNNNNNNN7"\NNNNNNNNNNNNNNNNNNNNNNRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PB_SECO) ;NEXT SECTOR ; LD HL,(IO ANNNNNNNNNNNNNNNNNN7(+NNNNNNNNNNNNNNNNNNNNN!+++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PB_DRVO) CP A,NDRVS ;IF DRIVE # OUT OF RANGE THEN RETU2!NNNNNNNNNNNNNNNNNN7.1NNNNNNNNNNNNNNNNNNNNNN DB 1 ENDM JADE3: REPT 4 ;3" FLOPPY DRIVES DB DD_PRT3 ENDM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROLLER PRu$NNNNNNNNNNNNNNNNNNNN7[-NNNNNNNNNNNNNNNNNNNNN! A,MR_RNUM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (M2_RSEL),A ; ; MONITOR ROM CONTINUES EXECUTION SNNNNNNNNNNNNNNNNNN7 x"NNNNNNNNNNNNNNNNNNNNNNC LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JRrNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNN7> 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT2 ; LDIR ;uNNNNNNNNNNNNNNNNNN7-RNNNNNNNNNNNNNNNNNNNNNN ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THEwNNNNNNNNNNNNNNNNNN7_,NNNNNNNNNNNNNNNNNNNNN!TABLE ; LD A,(IX + PB_CMDO) ;IF UNSUPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 LD HL,JADRNNNNNNNNNNNNNNNNNN7 |#NNNNNNNNNNNNNNNNNNNNNN###################### ; ; COMMAND TYPE TABLE ; ;#########################################################################gNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNN! EQU ($ - JADETBL) / 2 ;**************************************************************************** ; ; ILLEGAL COMMAND xNNNNNNNNNNNNNNNNNN7:=NNNNNNNNNNNNNNNNNNNNNN: LD (IX + PB_STATO),PB_CNP JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;$NNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERRONNNNNNNNNNNNNNNNNN7"lNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONL NNNNNNNNNNNNNNNNNN7(NNNNNNNNNNNNNNNNNNNNNN JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++(cNNNNNNNNNNNNNNNNNNN7.NNNNNNNNNNNNNNNNNNNNNN COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INNNNNNNNNNNNNNNNNN7lNNNNNNNNNNNNNNNNNNNNNNETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + PB_DRVNNNNNNNNNNNNNNNNNNNN7 ONNNNNNNNNNNNNNNNNNNNNN### JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW JTYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SEND SEC:NNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNERROR ; ;**************************************************************************** DCMDERR: LD (IX + PB_STATO),PB_ILCMD cBNNNNNNNNNNNNNNNNNN7 NNNNNNNNNNNNNNNNNNNNNN TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLEk~rNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT1 ; LDIR ; ; REMOVE JAD'uNNNNNNNNNNNNNNNNNN7#]NNNNNNNNNNNNNNNNNNNNNNTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++'NNNNNNNNNNNNNNNNNN7)/NNNNNNNNNNNNNNNNNNNNNN++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT v)NNNNNNNNNNNNNNNNNN7/0NNNNNNNNNNNNNNNNNNNNNNNTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EX}!NNNNNNNNNNNNNNNNNN79NNNNNNNNNNNNNNNNNNNNNNNO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THEN NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HARD DISK NNNNNNNNNNNNNNNNNN7 օNNNNNNNNNNNNNNNNNNNNNNTOR DATA DW JTYPE2 ;FORMAT TRACK " " " DW JTYPE1 ;READ ADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTPUT IOPB ONL NNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNN! ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET ;*************************************************************NNNNNNNNNNNNNNNNNN72NNNNNNNNNNNNNNNNNNNNNNR PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|BNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL &ANNNNNNNNNNNNNNNNNN7$YNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DD_MB1 JT2A: OUT (C),A +yNNNNNNNNNNNNNNNNNNNN7*zNNNNNNNNNNNNNNNNNNNNNN ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JeINNNNNNNNNNNNNNNNNN70}NNNNNNNNNNNNNNNNNNNNN!ECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁn= ۅyH扵S"`/͒k: ؖvE䚴R!𞿟],ʣh8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8CNNNNNNNNNNNNNNNNNNNNNNERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELE{&NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, H\ NNNNNNNNNNNNNNNNNN8 jNNNNNNNNNNNNNNNNNNNNNN++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF= 0: OKNNNNNNNNNNNNNNNNNN8&NNNNNNNNNNNNNNNNNNNNNNFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL MICROMATION PRIMITIVES ;++++++++++++++++++++NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!T UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; POP BC LD A,C ;COMPUTE & SET DRIV@S NNNNNNNNNNNNNNNNNN8c{NNNNNNNNNNNNNNNNNNNNNNDRIVE PUSH HL LD A,-1 ;FORCE HARDWARE RESET LD (IOPB + PB_DRVO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STP!NNNNNNNNNNNNNNNNNN8%%NNNNNNNNNNNNNNNNNNNNNNOR ; 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_SECO),HL ; ;Q NNNNNNNNNNNNNNNNNN8+*NNNNNNNNNNNNNNNNNNNNNNA JP DKRET ENDIF ; ;---------------------------------------------------------------------------- ; ; 5" HARD DISK BOrNNNNNNNNNNNNNNNNNN8TNNNNNNNNNNNNNNNNNNNNNNCT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL rNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++++++++++++rNNNNNNNNNNNNNNNNNN8S9NNNNNNNNNNNNNNNNNNNNNN, /0: ERROR ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JWAIT: ; ; ISSUES NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;+++++++++++++++++++++++++++++++++++++++++*NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!E SUB A,ISHA8 - DRVPRT ; ; IF 5" DRIVE THEN DO DIFFERENT ; CP A,ISHA8 - DRVPRT JP NC,HBOOT5 ; ; COMPUTE LOGICAL DNNNNNNNNNNNNNNNNNN8 vNNNNNNNNNNNNNNNNNNNNNNATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; POP HL ;RESTORE DRIVE LD A,L LD (IOPB + PB_DRVO),A ; LD A,PB79NNNNNNNNNNNNNNNNNN8&vNNNNNNNNNNNNNNNNNNNNNN PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOrNNNNNNNNNNNNNNNNNN8,3NNNNNNNNNNNNNNNNNNNNNNOT ; ENTRY- BC= DRIVE WORD ; HBOOT5: ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; LD A,C LD (IOPB + PB_DRVO),A ; ; COMPUY}NNNNNNNNNNNNNNNNNNN8%eNNNNNNNNNNNNNNNNNNNNNN LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,PB_BCNTNNNNNNNNNNNNNNNNNN8 ʮNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONS ; EN,NNNNNNNNNNNNNNNNNNN8`NNNNNNNNNNNNNNNNNNNNN! PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; }I9NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOT ;*********************************************e'NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,ISHA8 - DRVPRT LD (IOPB + PB_DRVO),A bNNNNNNNNNNNNNNNNNN8!ENNNNNNNNNNNNNNNNNNNNNN_LOGC LD (IOPB + PB_CMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_9 NNNNNNNNNNNNNNNNNN8'GNNNNNNNNNNNNNNNNNNNNNNR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,eeNNNNNNNNNNNNNNNNNN8-NNNNNNNNNNNNNNNNNNNNNNTE SECTOR FROM LOGICAL DRIVE ; LD A,B RRCA ;UPPER NIBBLE = HEAD RRCA AND A,0C0H ;MASK OFF UNUSED BITS EXX ;SAVENNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SIZE - PB_BCNTO ; ; UPLOAD STATUS BYTES ; LDIR ; ; R?I9NNNNNNNNNNNNNNNNNN8 NNNNNNNNNNNNNNNNNNNNNNTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++NNNNNNNNNNNNNNNNNN8sENNNNNNNNNNNNNNNNNNNNNN WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO+\NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN******************************* ; ; Hard disk boot function. ; This module reads the BIOS image to the proper system ; addre݂NNNNNNNNNNNNNNNNNN86(NNNNNNNNNNNNNNNNNNNNNNPOP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OF0rNNNNNNNNNNNNNNNNNN8"NNNNNNNNNNNNNNNNNNNNNNCMDO),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 (IOP= (0FC00H AND 7F" NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN! H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; PUSH BC LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; SEINNNNNNNNNNNNNNNNNN8PJNNNNNNNNNNNNNNNNNNNNNNB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD HL,(IOPB + PB_DRVO) ;SAVE  NNNNNNNNNNNNNNNNNN8$NNNNNNNNNNNNNNNNNNNNN!O FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECT_NNNNNNNNNNNNNNNNNNN8*NNNNNNNNNNNNNNNNNNNNN!DLP ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR 2gNNNNNNNNNNNNNNNNNN80uNNNNNNNNNNNNNNNNNNNNNN A,-1 LD (IOPB + PB_DRVO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADA?HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅuD≱O퍼Z)Ȓf5Ӗq@ߚ~M랺Y(ƣd3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8t7NNNNNNNNNNNNNNNNNNNNNNPTER LOG-ON ; POP HL ;RESTORE DRIVE LD A,L LD (IOPB + PB_DRVO),A ; LD (IX + PB_CMDO),PB_LOGC ; CALL ISHAX CALL D:VNNNNNNNNNNNNNNNNNN8ޑNNNNNNNNNNNNNNNNNNNNNNFETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H zNNNNNNNNNNNNNNNNNN8 1ZNNNNNNNNNNNNNNNNNNNNNN POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF NOT DONE THEN LOOP DEC (HL) JR HDRDLP5 ; ; LOAD DONNNNNNNNNNNNNNNNNNN8&NNNNNNNNNNNNNNNNNNNNNNECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT TO 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SEQNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,DE JR C,LEN_OK JR Z,LEN_OK ; INC A JP LEN_LP ; ;JNNNNNNNNNNNNNNNNNN8TKNNNNNNNNNNNNNNNNNNNNNNAS DOWN DRIVE NUMBER ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB A,ISHA8 - DRVPRT ; ; IF NO8BNNNNNNNNNNNNNNNNNN8%NNNNNNNNNNNNNNNNNNNNNN + PB_DRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RESET THhNNNNNNNNNNNNNNNNNN8+NNNNNNNNNNNNNNNNNNNNN!-------------------------------------------------------------------- ; ; 5" DRIVER ; ISHAX5: ; ; BIAS DOWN TO PHYSICALa"BNNNNNNNNNNNNNNNNNN8!dNNNNNNNNNNNNNNNNNNNNNNQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) AND A,3 ;LIMIT TO 1K SECTORS EXX LD HL,128NNNNNNNNNNNNNNNNNN8ίNNNNNNNNNNNNNNNNNNNNNN; ; 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 )GBNNNNNNNNNNNNNNNNNN8d NNNNNNNNNNNNNNNNNNNNNNE ; HBRDDN: LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORINNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!CTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,0 ADD HL,DE ; ; F8rNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN ; SECTOR COUNT IN A ; LEN_OK: ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A SNNNNNNNNNNNNNNNNNN8 ANNNNNNNNNNNNNNNNNNNNNNT 8" THEN EXIT TO 5" ; CP A,ISHA8 - DRVPRT JP NC,ISHAX5 ; ; ELSE STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD (IX + PB_DJ6NNNNNNNNNNNNNNNNNN8&FNNNNNNNNNNNNNNNNNNNNNNE CONTROLLER ; ISHACLR: LD A,1 SHL ISH_RESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT$NNNNNNNNNNNNNNNNNN8,NNNNNNNNNNNNNNNNNNNNNN DRIVE ; SUB A,ISHA5 - ISHA8 ADD A,4 ; ; STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD C,(IX + PB_DRVO) ;SAVE LOGICAL DRIONNNNNNNNNNNNNNNNNN8UNNNNNNNNNNNNNNNNNNNNN! ; OR A,A JR Z,GOTSSZ ; HBTSSZ: ADD HL,HL DEC A JR NZ,HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: LD (IOPNNNNNNNNNNNNNNNNNN8 NNNNNNNNNNNNNNNNNNNNNN+ PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CAyNNNNNNNNNNNNNNNNNN8W8NNNNNNNNNNNNNNNNNNNNNNS OR A JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPBNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN RET SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNN8!rNNNNNNNNNNNNNNNNNNNNNNRVO),A ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; OUTPUT THE IOPB ADDRESS TO HOSNNNNNNNNNNNNNNNNNN8'wNNNNNNNNNNNNNNNNNNNNNN: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING FNNNNNNNNNNNNNNNNNN8-7NNNNNNNNNNNNNNNNNNNNNNVE LD (IX + PB_DRVO),A ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH BC PUSH IX POP BC ; ; OUrNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!PB + PB_BCNTO),HL ;SET XFER COUNT EXX ;SAVE IN ALT REG ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC9NNNNNNNNNNNNNNNNNN8 NNNNNNNNNNNNNNNNNNNNNNLL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SET UP IOPB FOR BIOS READ JP C,DKRET ; ; DO WHILE CNT > 0 ;NNNNNNNNNNNNNNNNNN8DuNNNNNNNNNNNNNNNNNNNNNNB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EX&BNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;+++++++++++++++++++rNNNNNNNNNNNNNNNNNN8"'NNNNNNNNNNNNNNNNNNNNNNT ADAPTER ; LD 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,IsNNNNNNNNNNNNNNNNNN8(INNNNNNNNNNNNNNNNNNNNNNWITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLRWT ;IF BUSNNNNNNNNNNNNNNNNNNN8.bNNNNNNNNNNNNNNNNNNNNNNTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B{!rNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 gNNNNNNNNNNNNNNNNNNN8 NNNNNNNNNNNNNNNNNNNNNN HDRDLP5: LD A,(BIOSLN) OR A,A JR Z,HBRDDN ; CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT S]NNNNNNNNNNNNNNNNNN8wDNNNNNNNNNNNNNNNNNNNNNNIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SETBIOPB: ;UNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNBC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PYrNNNNNNNNNNNNNNNNNN82)NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) wNNNNNNNNNNNNNNNNNN8#NNNNNNNNNNNNNNNNNNNNNNSH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; XOR A,A OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; QNNNNNNNNNNNNNNNNNN8)xNNNNNNNNNNNNNNNNNNNNNNY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD (IX + PB_S NNNNNNNNNNNNNNNNNN8/QNNNNNNNNNNNNNNNNNNNNNN OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; XOR A,A OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_C(NNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; rNNNNNNNNNNNNNNNNNN8 kNNNNNNNNNNNNNNNNNNNNNNECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXXrNNNNNNNNNNNNNNNNNN8"NNNNNNNNNNNNNNNNNNNNNN ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SsNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,\dNNNNNNNNNNNNNNNNNN8gzNNNNNNNNNNNNNNNNNNNNNNINC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; BI dNNNNNNNNNNNNNNNNNN8$$NNNNNNNNNNNNNNNNNNNNNNOUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP AF LD (IX!NNNNNNNNNNNNNNNNNN8*+NNNNNNNNNNNNNNNNNNNNNNTATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATO),A OR A,A RET ; ;--------NNNNNNNNNNNNNNNNNN80BNNNNNNNNNNNNNNNNNNNNNNMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE TINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁn= ۅyH扵S"^-˒i8֖tC⚱OힼZ)ǣe4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN95NNNNNNNNNNNNNNNNNNNNNNHE IOPB LOGICAL DRIVE ; POP BC LD (IX + PB_DRVO),C ; ; RETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RETNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ;oNNNNNNNNNNNNNNNNNN9 pNNNNNNNNNNNNNNNNNNNNN!RS LD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA |^NNNNNNNNNNNNNNNNNN9PNNNNNNNNNNNNNNNNNNNNNNENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)NNNNNNNNNNNNNNNNNN9iNNNNNNNNNNNNNNNNNNNNN!1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTJ_INNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;****************** (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END ՆNNNNNNNNNNNNNNNNNN9 GNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN9gNNNNNNNNNNNNNNNNNNNNNN****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. :NNNNNNNNNNNNNNNNNN9YNNNNNNNNNNNNNNNNNNNNNNong with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot optionn:dNNNNNNNNNNNNNNNNNN9"NNNNNNNNNNNNNNNNNNNNNNe floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; NNNNNNNNNNNNNNNNNNN9%ȡNNNNNNNNNNNNNNNNNNNNN! SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;====мNNNNNNNNNNNNNNNNNN9+NNNNNNNNNNNNNNNNNNNNNNEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;===========BNNNNNNNNNNNNNNNNNN9WNNNNNNNNNNNNNNNNNNNNNN################################################################### ; ; MESSAGES ; ;######################################O9NNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec #NAME CONMSG **** Phase Error - #NAME Not Equal to *ROM.DEF **** ENDIF ENDM SUBTTjrNNNNNNNNNNNNNNNNNN9GNNNNNNNNNNNNNNNNNNNNNNOPB ; ;############################################################################ LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;vNNNNNNNNNNNNNNNNNNN9 HNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; NNNNNNNNNNNNNNNNNN9VNNNNNNNNNNNNNNNNNNNNNN.6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out t NNNNNNNNNNNNNNNNNN9DNNNNNNNNNNNNNNNNNNNNNNsk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives noNNNNNNNNNNNNNNNNNN9#bNNNNNNNNNNNNNNNNNNNNNNoved DCM & BLT loader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory rNNNNNNNNNNNNNNNNNN9)NNNNNNNNNNNNNNNNNNNNNNLT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===================NNNNNNNNNNNNNNNNNN9/'jNNNNNNNNNNNNNNNNNNNNNNL UNINITIALIZED DATA ;############################################################################ ; ; PAGE 0 RESERVED AREA?O!NNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNN!DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 128 ;XFER COUNT DB 0,0FNNNNNNNNNNNNNNNNNN9 tNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN9TNNNNNNNNNNNNNNNNNNNNN! ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**********************$NNNNNNNNNNNNNNNNNN9hNNNNNNNNNNNNNNNNNNNNNNhat if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit al\!NNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNw assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" JadNNNNNNNNNNNNNNNNNN9$NNNNNNNNNNNNNNNNNNNNNNeferences to new format. ; VERSN EQU 304 ; ;**************************************************************************** {BNNNNNNNNNNNNNNNNNN9*؟NNNNNNNNNNNNNNNNNNNNNN========================================================= ; ;*INCLUDE ZMONROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.D*INNNNNNNNNNNNNNNNNN904'NNNNNNNNNNNNNNNNNNNNNN ; ;############################################################################ ORG 0040H ; ; BOOT VARIABLES ; PHASE*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁn= ۅyH扵T#`/͒k: ؖvE䚴R!𞿟],ʣh7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN:oNNNNNNNNNNNNNNNNNNNNNNCK ?DKPROM DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY QNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK ?DKFUNC JP DKFUNC ;*******************************ENNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNNN SYSTEM ; ;---------------------------------------------------------------------------- COLD: DI ;DISABLE ROM IMAGE OUT (1 NNNNNNNNNNNNNNNNNN:~NNNNNNNNNNNNNNNNNNNNNN 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 8" MICROMATION (INTEL M2FM) ; hNNNNNNNNNNNNNNNNNN:$NNNNNNNNNNNNNNNNNNNNNNOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,14H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN+ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F5BOOT: EQU NNNNNNNNNNNNNNNNNN:%dMNNNNNNNNNNNNNNNNNNNNNN+++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,?DDPORT8 IN A,(C) AND A,?DDSASW RLCA OR A,HIGH ?DDBASE LD rNNNNNNNNNNNNNNNNNN:+GBNNNNNNNNNNNNNNNNNNNNNNC,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + ?BDSIOSS) LD A,H LD H,0 LD (IOPB + ?PBSECO),HL oUBNNNNNNNNNNNNNNNNNN: D0..D7 SNNNNNNNNNNNNNNNNNN:BNNNNNNNNNNNNNNNNNNNNNNT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;-------------------------------------------------------------9BNNNNNNNNNNNNNNNNNN:!NNNNNNNNNNNNNNNNNNNNNNBOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTT NNNNNNNNNNNNNNNNNN:'/NNNNNNNNNNNNNNNNNNNNN!ST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB NNNNNNNNNNNNNNNNNN:-NNNNNNNNNNNNNNNNNNNNNNETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CA NNNNNNNNNNNNNNNNNN:QNNNNNNNNNNNNNNNNNNNNNNOT VECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CH_NNNNNNNNNNNNNNNNNN: rNNNNNNNNNNNNNNNNNNNNNN++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++++++ҹNNNNNNNNNNNNNNNNNN:-NNNNNNNNNNNNNNNNNNNNNN------------------------------ DS ?XOVER - $ ;POSITION CODE DKRET: LD A,?XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGNgNNNNNNNNNNNNNNNNNN:4NNNNNNNNNNNNNNNNNNNNN!RL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JR NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE F$BNNNNNNNNNNNNNNNNNN:@NNNNNNNNNNNNNNNNNNNNNN--------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET ;+++++++++++++++++++++++++++++++++++++++++++++++CNNNNNNNNNNNNNNNNNN:"NNNNNNNNNNNNNNNNNNNNNNL JADE BOOT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROU/NNNNNNNNNNNNNNNNNN:(NNNNNNNNNNNNNNNNNNNNNN ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + ?PBDRVO),A ; LD A,2 ;SET SECTOR LD (IOPB + ?PBSECO),A ; ; LOG ON DRIVE lNNNNNNNNNNNNNNNNNNN:.NNNNNNNNNNNNNNNNNNNNN!LL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + ?PBSECO) ;NEXT SECTOR ; LD HL,(IOPB + ?PBDMAO) ;BUMP LOAD ADDRESS LD rNNNNNNNNNNNNNNNNNN:bNNNNNNNNNNNNNNNNNNNNNNAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RET NOP NOP ;+++++++++++++++++++OYNNNNNNNNNNNNNNNNNNN: ANNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK ?DSKX JP DSKX SUBTTL MAIN FUNCTIONS ;-----mNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN NEXT INSTRUCTION OUT (?ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;-----------------------------------------NNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNN!OR BIOS ; LD A,C LD (LOGINBYTE),A LD (?DKPROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DNNNNNNNNNNNNNNNNNN:qNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN:#NNNNNNNNNNNNNNNNNNNNNNTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM TH(NNNNNNNNNNNNNNNNNN:)! NNNNNNNNNNNNNNNNNNNNNN; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; LD (IX + ?PBSECO),?BTDIRS LD (IX + ?PBCMDO)ϮNNNNNNNNNNNNNNNNNN:/NNNNNNNNNNNNNNNNNNNNNNDE,SECSIZ ADD HL,DE LD (IOPB + ?PBDMAO),HL ; LD HL,BIOSLN ;IF --COUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF BNNNNNNNNNNNNNNNNNN:7NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++9NNNNNNNNNNNNNNNNNN: 3NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------------- ; ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN$NNNNNNNNNNNNNNNNNN:ONNNNNNNNNNNNNNNNNNNNNN----------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 =kINNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNN!ISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BXoNNNNNNNNNNNNNNNNNN:"NNNNNNNNNNNNNNNNNNNNNN++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DmNNNNNNNNNNNNNNNNNN:$W|NNNNNNNNNNNNNNNNNNNNN!E DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN:*tsNNNNNNNNNNNNNNNNNNNNNN,?DDRDS CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,86H JP NNNNNNNNNNNNNNNNNN:0NNNNNNNNNNNNNNNNNNNNNNDEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET ELSE ; ; EXECUTE THE BIOS COLD START ENTRY ; nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅuD≱O퍼[+ɒg6ԖsBᚱOힼZ)ǣe4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN:_NNNNNNNNNNNNNNNNNNNNNN LD HL,(BIOSNT) JP (HL) ENDIF SUBTTL DISK IOPB EXECUTOR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN:3NNNNNNNNNNNNNNNNNNNNNN JADEX ;ELSE MUST BE JADE CONTROLLER ; ; ; DRIVE PORT TABLE ; DRVPRT: REPT 4 ;8" FLOPPY DRIVES DB ?DDPORT8 ENDM $NNNNNNNNNNNNNNNNNN: 2NNNNNNNNNNNNNNNNNNNNNN IN A,(C) EXX INC A ;0FFH IF NOT THERE JR Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS@NNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNNA PUSH HL LD HL,JADERET EX (SP),HL JP (HL) ;EXECUTE THE DRIVER TYPE ; ; JADE ROUTINES RETURN HERE ; JADERET: rNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNLAGS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPE4 ;SEEK TRACK " " DW JTYPE5 ;SET DRIVE PARAMqNNNNNNNNNNNNNNNNNN:#NNNNNNNNNNNNNNNNNNNNNN*********** JSELERR: LD (IX + ?PBSTATO),?SELERR JP DSKERR ;***********************************************************UNNNNNNNNNNNNNNNNNN:%S}NNNNNNNNNNNNNNNNNNNNNN BIT ?PBFNXB,(IX + ?PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; ; XFER DATA FROM CONTROLLER ; JT1A: EXX LD A,?DNNNNNNNNNNNNNNNNNN:+prNNNNNNNNNNNNNNNNNNNNNN1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + ?PBSTATO),?IOPBERR ;PASS BACK ERROR JP DSKERR ;++++++++++++++++++++++++-rNNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HܥdNNNNNNNNNNNNNNNNNN:#NNNNNNNNNNNNNNNNNNNNNN REPT 4 ;8" HARD DISK DRIVES DB ?HSTATUS ENDM REPT 4 ;5" FLOPPY DRIVES DB ?DDPORT5 ENDM REPT 4 ;8" MICROMATION DOĺNNNNNNNNNNNNNNNNNN:aNNNNNNNNNNNNNNNNNNNNNN SELECT SWITCH DATA AND A,?DDSASW RLCA OR A,HIGH ?DDBASE EXX LD H,A LD L,0 EXX ; ; USE COMMAND TO INDEX INTO DucdNNNNNNNNNNNNNNNNNN:eNNNNNNNNNNNNNNNNNNNNNNPOP HL ;RESTORE DRIVE BUT SAVE FLAGS (ERROR) LD (IX + ?PBDRVO),H RET ;################################################[NNNNNNNNNNNNNNNNNN:FNNNNNNNNNNNNNNNNNNNNN!ETERS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JTYPE4 ;SET EIA BAUD RATE " " DW JTYPE4 ;CLEAR NNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNNN***************** ; ; CONTROLLER NOT SENSED ERROR ; ;***********************************************************************9NNNNNNNNNNNNNNNNNN:&.NNNNNNNNNNNNNNNNNNNNNNDMB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,?DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ;fNNNNNNNNNNNNNNNNNN:,NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXIT - A= 0 ; ;+++++++++++++++++++++++NNNNNNNNNNNNNNNNNN:=NNNNNNNNNNNNNNNNNNNNNNL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE9?INNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNNNUBLER DRIVES DB 1 ENDM REPT 4 ;3" FLOPPY DRIVES DB ?DDPORT3 ENDM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROLNNNNNNNNNNNNNNNNNN:PNNNNNNNNNNNNNNNNNNNNN!RIVER TABLE ; LD A,(IX + ?PBCMDO) ;IF UNSUPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 LD NNNNNNNNNNNNNNNNNNN:VNNNNNNNNNNNNNNNNNNNNNN############################ ; ; COMMAND TYPE TABLE ; ;###################################################################%NNNNNNNNNNNNNNNNNNNN:uNNNNNNNNNNNNNNNNNNNNNN " " NJCMDS EQU ($ - JADETBL) / 2 ;**************************************************************************** ; ; ILLNNNNNNNNNNNNNNNNNN:!NNNNNNNNNNNNNNNNNNNNN!***** JCNP: LD (IX + ?PBSTATO),?CNPERR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN:'5NNNNNNNNNNNNNNNNNNNNNN FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + ?PBDMAO) LD D,(IX + [?PBDMAhBNNNNNNNNNNNNNNNNNN:-NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN:fNNNNNNNNNNNNNNNNNNNNNN CONTROLLER PORT ; LD A,(IX + ?PBDRVO) CP A,NDRVS ;IF DRIVE # OUT OF RANGE THEN RETURN ERROR JP NC,JSELERR ; LD HL,DR NNNNNNNNNNNNNNNNNN: ENNNNNNNNNNNNNNNNNNNNN!LER PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTIbdNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNHL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + NNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN######### JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW JTYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SENNNNNNNNNNNNNNNNNN:pNNNNNNNNNNNNNNNNNNNNN!EGAL COMMAND ERROR ; ;**************************************************************************** DCMDERR: LD (IX + ?PBSTATNNNNNNNNNNNNNNNNNNN:"NNNNNNNNNNNNNNNNNNNNNN++++++ ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C-NNNNNNNNNNNNNNNNNN:(%!NNNNNNNNNNNNNNNNNNNNNNO + 1]) ; ; FETCH XFER COUNT ; LD C,(IX + ?PBST4O) LD B,(IX + ?PBST5O) ; ; CHECK FOR LEGAL COUNT ; LD A,B ;IF C !NNNNNNNNNNNNNNNNNNNN:.NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTRYNNNNNNNNNNNNNNNNNN:UNNNNNNNNNNNNNNNNNNNNNNVPRT ;CALULATE DRIVE PORT TABLE ELEMENT ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH CONTROLLER PORT EXX_NNNNNNNNNNNNNNNNNNN: vNNNNNNNNNNNNNNNNNNNNNNON ; ENTRY- IX= IOPB ADDRESS ; C'= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++BNNNNNNNNNNNNNNNNNN:,NNNNNNNNNNNNNNNNNNNNNN?PBDRVO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THEN NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HARD NNNNNNNNNNNNNNNNNN:0NNNNNNNNNNNNNNNNNNNNN!ND SECTOR DATA DW JTYPE3 ;FORMAT TRACK SEND DRIVER CODE DW JTYPE1 ;READ ADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTNNNNNNNNNNNNNNNNNN:ANNNNNNNNNNNNNNNNNNNNNNTO),?CMDERR ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET ;*************************************************INNNNNNNNNNNNNNNNNN:#NNNNNNNNNNNNNNNNNNNNN!'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNN:)NNNNNNNNNNNNNNNNNNNNNNOUNT == 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; LDIR ;XFER DATA ; ; REMOVE JADE W rNNNNNNNNNNNNNNNNNN:/NNNNNNNNNNNNNNNNNNNNNNOLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++PhBNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN LD C,A EXX ; CP A,?HSTATUS ;IF HARD DISK THEN EXIT JP Z,ISHAX ; DEC A ;IF MICROMATION THEN EXIT JP Z,M2X ; JPrNNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADEX: ; ; CHECK FOR CONTROLLER PRESENT ; EXX $NNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNDISK CP A,4 ;IF 5" THEN OK JR C,JADEOK ; SUB A,8 ;SKIP OVER MICROMATION TO 3", ASSUME OK ; JADEOK: LD (IX + ?PBDRVO),NNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNN!PUT IOPB ONLY DW JTYPE4 ;EIA STATUS " " DW JTYPE4 ;IDLE " " DW JTYPE4 ;RETURN VERSION " " DW JTYPE5 ;SET DISK FLBNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN*************************** ; ; ILLEGAL DRIVE REQUESTED ; ;*****************************************************************NNNNNNNNNNNNNNNNNN:$`LNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; CHECK FOR XFER INHIBIT ; NNNNNNNNNNNNNNNNNN:*CCNNNNNNNNNNNNNNNNNNNNNNWINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL JTNNNNNNNNNNNNNNNNNN:0NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; CHECK FOR XFER INHIBIT ; BIT ?PBFNXB,(IX + ?PBFLGO) ;IF FLAG == TRUE n' NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁn= ۅzI牶U$Ža1ϒm< ۖyH暶T#`/ͣk: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNTHEN NO XFER JR NZ,JT2 ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,?DDMB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ANNNNNNNNNNNNNNNNNN;r}NNNNNNNNNNNNNNNNNNNNNN NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: ; ; OPENNNNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNNNULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DENNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 3 JADE COMMAND XFERS FORMAT PGM TO CONTROLLER ; ENTRY->NNNNNNNNNNNNNNNNNN;RNNNNNNNNNNNNNNNNNNNNNN0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX2ENNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNOLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++8Z NNNNNNNNNNNNNNNNNN;%NNNNNNNNNNNNNNNNNNNNNNES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++++D/NNNNNNNNNNNNNNNNNN;+1NNNNNNNNNNNNNNNNNNNNNNPUTE & SET DRIVE SUB A,4 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE ΎNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNDDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; LD L,(IX + ?PBDMAO) LD H,(IX + rNNNNNNNNNNNNNNNNNN;bCNNNNNNNNNNNNNNNNNNNNNN WINDOW TO COMMAND BUFFER ; EXX LD A,?DDMB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO C3NNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK<-NNNNNNNNNNNNNNNNNN;$]NNNNNNNNNNNNNNNNNNNNNN IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++5NNNNNNNNNNNNNNNNNN;RNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS SECTOR BUF}NNNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNNN+++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SPHNNNNNNNNNNNNNNNNNNN;&GNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOT ;********************h NNNNNNNNNNNNNNNNNN;,aNNNNNNNNNNNNNNNNNNNNNNUP ADD A,4 LD (IOPB + ?PBDRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += ,rNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN[?PBDMAO + 1]) ; ; FETCH COUNT ; LD C,(IX + ?PBST4O) LD B,(IX + ?PBST5O) ; ; CHECK FOR VALID COUNT ; LD A,B ;IFnNNNNNNNNNNNNNNNNNN; QrNNNNNNNNNNNNNNNNNNNNNNDB ; PUSH HL EXX POP HL LD DE,?DDCBO ADD HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN WINDOW ; EXX LD A,?DDMB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL LD DE,?DDCBO + NNNNNNNNNNNNNNNNNN;lNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE3: ; ; CHECK FOR XFER INHIBIT ; BIT ?PBFNXB,(IX NNNNNNNNNNNNNNNNNNN;4cNNNNNNNNNNNNNNNNNNNNNNFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; 8NNNNNNNNNNNNNNNNNN;!=NNNNNNNNNNNNNNNNNNNNN!),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC DE ;IF NO)NNNNNNNNNNNNNNNNNN;'tNNNNNNNNNNNNNNNNNNNNNN******************************************************** ; ; Hard disk boot function. ; This module reads the BIOS image to t3PNNNNNNNNNNNNNNNNNN;-PNNNNNNNNNNNNNNNNNNNNNN128 AND A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THENK_BNNNNNNNNNNNNNNNNNN;'.NNNNNNNNNNNNNNNNNNNNNN COUNT == 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; LDIR ;XFER DATA ; JT2: ; ; FlrNNNNNNNNNNNNNNNNNN; !NNNNNNNNNNNNNNNNNNNNNNESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,?PBSTATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THE COMMAND ; LDhNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN!?PBSTATO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,?PBSTATO ADD HL,BC CNNNNNNNNNNNNNNNNNNN;B?NNNNNNNNNNNNNNNNNNNNNN+ ?PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT2 ; ; SELECT CONTROLLER WINDOW ; EXX LD A,?DDMB0 JP JT2A ;COMMON XHNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 ;XFER DATANNNNNNNNNNNNNNNNNN;"nNNNNNNNNNNNNNNNNNNNNNNT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKEQNNNNNNNNNNNNNNNNNN;(dNNNNNNNNNNNNNNNNNNNNNNhe proper system ; address & jumps to the BIOS cold start entry point. ; ;***************************************************rNNNNNNNNNNNNNNNNNN;.NNNNNNNNNNNNNNNNNNNNNN USE PLATTER 1 ADD A,B LD (IOPB + ?PBSECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,?DDCLR LD (IOPB + ?PBCMDONNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN!ALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;fHNNNNNNNNNNNNNNNNNNN; 7NNNNNNNNNNNNNNNNNNNNN! A,?DDEXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INTO GET RESULTS gtrNNNNNNNNNNNNNNNNNN;ۨNNNNNNNNNNNNNNNNNNNNNNEX DE,HL ; ; COUNT = REMAINDER ; LD BC,?IOPBSZ - ?PBSTATO ; ; UPLOAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WIND>:NNNNNNNNNNNNNNNNNN;qNNNNNNNNNNNNNNNNNNNNNNWITH WRITE SECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JADE COMMAND9NNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;+++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN;#_NNNNNNNNNNNNNNNNNNNNNNRR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,?DDSHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ ANDrHNNNNNNNNNNNNNNNNNN;)WNNNNNNNNNNNNNNNNNNNNNN************************* H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ [NNNNNNNNNNNNNNNNNNN;/2NNNNNNNNNNNNNNNNNNNNN!),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,?DDL\aDNNNNNNNNNNNNNNNNNN;ALNNNNNNNNNNNNNNNNNNNNNN EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0:NNNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNN!FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESINNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + ?PBSTATO) OR A,A RET ;+++++++++++++++++ NNNNNNNNNNNNNNNNNN;a0NNNNNNNNNNNNNNNNNNNNN! XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= ,rNNNNNNNNNNNNNNNNNN;˖NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= PORT OF CONTR NNNNNNNNNNNNNNNNNN;$!NNNNNNNNNNNNNNNNNNNNN! 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL MICROMATION PRIMITIV,NNNNNNNNNNNNNNNNNN;*NNNNNNNNNNNNNNNNNNNNNNH8B1 ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMzNNNNNNNNNNNNNNNNNN;0NNNNNNNNNNNNNNNNNNNNNNOG LD (IOPB + ?PBCMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + ?PBCMDOKrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅuD≱O퍼Z)Ȓg6ԖrAߚ~M랺Y(ƣd4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNO),?DDRDS ; EXX LD A,B EXX LD HL,?BTDIRS ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + kNNNNNNNNNNNNNNNNNN;EMNNNNNNNNNNNNNNNNNNNNN!T ; LD HL,(IOPB + ?PBSECO) ;NEXT SECTOR INC HL LD (IOPB + ?PBSECO),HL ; LD HL,(IOPB + ?PBDMAO) ;BUMP DMA ADDRESS LD %uNNNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNNNSTATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + ?PBCMDO) CP A,?DDCLR JR Z,ISHACLR tNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN?HCMD),A CALL HWBUSY ; XOR A,A OUT (?HDATA),A LD A,?HIOPBX OUT (?HCMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPNNNNNNNNNNNNNNNNNN;e1NNNNNNNNNNNNNNNNNNNNNNA JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL ?HERRB) OR (1 SHL ?HFEGNNNNNNNNNNNNNNNNNN;ϗNNNNNNNNNNNNNNNNNNNNN!; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= NNNNNNNNNNNNNNNNNN;%%NNNNNNNNNNNNNNNNNNNNN! LD (IOPB + ?PBDMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + ?PBSECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH aNNNNNNNNNNNNNNNNNN;+NNNNNNNNNNNNNNNNNNNNNNOPB ; LD DE,IOPB LD BC,?IOPBSZ LDIR RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++J'NNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN?PBSECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOrNNNNNNNNNNNNNNNNNN;UsNNNNNNNNNNNNNNNNNNNNN!DE,SECSIZ ADD HL,DE LD (IOPB + ?PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP NNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + ?PBDRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB A,4 LD (IX + ?PBDRV%dNNNNNNNNNNNNNNNNNN;mNNNNNNNNNNNNNNNNNNNNNNB COMMAND ; LD A,?HEXEC OUT (?HCMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC LD (IX + ?PBSECO),C LD (IX + ?rNNNNNNNNNNNNNNNNNN;0bNNNNNNNNNNNNNNNNNNNNN!RRB) LD (IX + ?PBSTATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(?HDATA) LD (IX + ?PBSTATO),A ;N0NNNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNNNA,A OUT (?HCMD),A ; CLRWT: IN A,(?HSTATUS) ;WAIT FOR CONTROLLER READY BIT ?HBUSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WrNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN************************************** HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(?HSTATUS) BIT ?HBUSYB,A JR NYdNNNNNNNNNNNNNNNNNN;#oNNNNNNNNNNNNNNNNNNNNN! HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLYdNNNNNNNNNNNNNNNNNN;)`NNNNNNNNNNNNNNNNNNNNN!************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; E@BNNNNNNNNNNNNNNNNNN;/NNNNNNNNNNNNNNNNNNNNNN++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNN;v|NNNNNNNNNNNNNNNNNNNNN!RORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKREdNNNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(?Hy NNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNER ; LD A,C OUT (?HDATA),A LD A,?HIOPBL OUT (?HCMD),A CALL HWBUSY ; LD A,B OUT (?HDATA),A LD A,?HIOPBH OUT (/HNNNNNNNNNNNNNNNNNN;VNNNNNNNNNNNNNNNNNNNNNNHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(?HSTATUS) BIT ?HBUSYB,?]rNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN!Z,HWBUSY ; ; ELSE RETURN ZF ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NNNNNNNNNNNNNNNNNN;$NNNNNNNNNNNNNNNNNNNNNNN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,SECSIZ LDIR ; ; SET UP FOR NEXT SECTOR READ ;NNNNNNNNNNNNNNNNNNNN;*5NNNNNNNNNNNNNNNNNNNNN!XIT - HL, DE, BC= ? ; ;**************************************************************************** IIOPB: ; ; MOVE THE IHNNNNNNNNNNNNNNNNNN;0ONNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++ DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNсo> ܅xG剴R [+ʒf5Ӗq? ۚzI瞵Q \*~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNPB DATA ; PUSH IX POP HL LD B,?IOPBSZ ; DBTE1: LD A,(HL) ;OUTPUT BYTE CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR NNNNNNNNNNNNNNNNNN<#PNNNNNNNNNNNNNNNNNNNNNN; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AʠNNNNNNNNNNNNNNNNNN< ̛NNNNNNNNNNNNNNNNNNNNNN******************************** CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;********************************************wNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNATCHER ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DKFUNC: ; ; i)INNNNNNNNNNNNNNNNNN<,NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # ; EXIT - HL= VERSION # IN BINARY NNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNB ?DDLOG ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW 2 ;SECTOR/SIDE DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA Db9NNNNNNNNNNNNNNNNNN<%CNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<+`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<ܥNNNNNNNNNNNNNNNNNNNNNN ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT Pq NNNNNNNNNNNNNNNNNN<3nNNNNNNNNNNNNNNNNNNNNNNF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLbNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN******************************** ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ;NNNNNNNNNNNNNNNNNN<upNNNNNNNNNNNNNNNNNNNNN! IF ILLEGAL FUCTION THEN RETURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ; ; ELSE SELECT FUNCTION ; PUSH HL NNNNNNNNNNNNNNNNNN<VNNNNNNNNNNNNNNNNNNNNNN; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HL,VERSN XOR A,A RET SUBTTLNNNNNNNNNNNNNNNNNN< !NNNNNNNNNNNNNNNNNNNNNNB 0,0,0,0 ;STATUS DW 128 ;XFER COUNT IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PBNNNNNNNNNNNNNNNNNN<&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<,LNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNORT # EXX LD A,C EXX CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUTPUT FDC ADDRESS LD A,H q$NNNNNNNNNNNNNNNNNN< _NNNNNNNNNNNNNNNNNNNNNNE OUTPUT ; ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRmi!NNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNN! ;**************************************************************************** PUTS: LD C,(HL) RES 7,C CALL CO ; BIT 7,LENNNNNNNNNNNNNNNNNN<FANNNNNNNNNNNNNNNNNNNNNN LD HL,FUNCTBL LD A,C 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 EX %NNNNNNNNNNNNNNNNNNN<eNNNNNNNNNNNNNNNNNNNNNNN INITIALIZED DATA ;############################################################################ ; ; MESSAGES ; ;#########dNNNNNNNNNNNNNNNNNNNN<!NNNNNNNNNNNNNNNNNNNNN!ROM! ENDIF END hdNNNNNNNNNNNNNNNNNN<'%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<-}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<vNNNNNNNNNNNNNNNNNNNNNN EXX CALL HTOA EXX LD A,L EXX CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR SUBTTL ASCII CHK NNNNNNNNNNNNNNNNNN< U NNNNNNNNNNNNNNNNNNNNN!Y- C= CHAR ; EXIT - AF= ? ; ;**************************************************************************** CO: IN A,(?NTS) ;/NNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN(HL) RET NZ ; INC HL JR PUTS ;**************************************************************************** ; ; OUT@NNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNN!(SP),HL RET ;############################################################################ ; ; FUNCTION TABLE ; ;#####NNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN################################################################### DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF,'CM DR TP9NNNNNNNNNNNNNNNNNN<"CNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<(5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<..NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<E2NNNNNNNNNNNNNNNNNNNNNNAR ROUTINES ;**************************************************************************** ; ; CONVERT BINARY NIBBLE TO ASCII-HNNNNNNNNNNNNNNNNNNN< f=NNNNNNNNNNNNNNNNNNNNNNIF BUSY THEN WAIT AND A,1 SHL ?NTBSY JR NZ,CO ; LD A,C OUT (?NTD),A RET ;***************************************yIrNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNPUT SPACE TO CONSOLE SUBR ; ;**************************************************************************** SPACE: LD C,' ' J[NNNNNNNNNNNNNNNNNN< #NNNNNNNNNNNNNNNNNNNNN!####################################################################### FUNCTBL: DW RETVER ;(0) RETURN VERSION # DW DQERR uNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5 PT CA' DM CR,LF ;############################################################# NNNNNNNNNNNNNNNNNN<#rNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN</NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN<aNNNNNNNNNNNNNNNNNNNNNNHEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;**************************************************************************** HTOA: ~dNNNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNN!************************************* ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;********************************************dNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNR CO SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPNNNNNNNNNNNNNNNNNN<0NNNNNNNNNNNNNNNNNNNNNN ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC EQU ($ - FUNCTBL) / 2 ;+++++++ ; 10..13= 3" Jade floppy ; VEUNNNNNNNNNNNNNNNNNN<qqNNNNNNNNNNNNNNNNNNNNNN EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H XOVER EQU PROMST + 30H ;ROM CROSS-OVER POINT PROMSIZ يNNNNNNNNNNNNNNNNNN<R~NNNNNNNNNNNNNNNNNNNNNN########################################################################### ORG 0040H ; ; BOOT VARIABLES ; DKPROM DS 2 ;LrNNNNNNNNNNNNNNNNNN<! NNNNNNNNNNNNNNNNNNNNNN************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; ;****************************************NNNNNNNNNNNNNNNNNN<'NNNNNNNNNNNNNNNNNNNNNN---------------------- ; ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;------------------------------------lNNNNNNNNNNNNNNNNNN<-MNNNNNNNNNNNNNNNNNNNNNN HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ;Y@NNNNNNNNNNNNNNNNNN<A3NNNNNNNNNNNNNNNNNNNNNN; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec D0..D7 SRL B RR C ENDM ; LD A,B ;CHECK FOR DRIVE # > 0FFH OR A,A JR N_NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNсo> ܅zI牶T#`0Βl; ٖwF嚵S"^-ˣi8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN=BNNNNNNNNNNNNNNNNNNNNNNZ,ABORT ; LD A,C ;TELL BIOS WHERE WE'RE AT LD (LOGINBYTE),A LD (DKPROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ;_NNNNNNNNNNNNNNNNNN=UNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++CNNNNNNNNNNNNNNNNNN= /NNNNNNNNNNNNNNNNNNNNNNUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM TNRNNNNNNNNNNNNNNNNNN=SNNNNNNNNNNNNNNNNNNNNNNEAD 1ST BIOS SECTOR ; LD (IX + PBSECO),BIOSSEC LD (IX + PBCMDO),DDRDS CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; FETNNNNNNNNNNNNNNNNNN=uNNNNNNNNNNNNNNNNNNNNNNISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++=NNNNNNNNNNNNNNNNNN=>NNNNNNNNNNNNNNNNNNNNNNUS ENDM REPT 4 ;5" FLOPPY DRIVES DB DDPORT5 ENDM REPT 4 ;8" MICROMATION DOUBLER DRIVES DB 1 ENDM REPT 4 ;3" FQNNNNNNNNNNNNNNNNNN=%5`NNNNNNNNNNNNNNNNNNNNNN OR A,HIGH DDBASE EXX LD H,A LD L,0 EXX ; ; USE COMMAND TO INDEX INTO DRIVER TABLE ; LD A,(IX + PBCMDO) ;IF UNSU NNNNNNNNNNNNNNNNNN=+oNNNNNNNNNNNNNNNNNNNNNNET ; ; ;############################################################################ ; ; COMMAND TYPE TABLE ; ;########RZNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FrNNNNNNNNNNNNNNNNNN=ENNNNNNNNNNNNNNNNNNNNNN+++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN=|NNNNNNNNNNNNNNNNNNNNNNHE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++d$NNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNCH PARAMETERS ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (PrNNNNNNNNNNNNNNNNNN= NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PBDR/INNNNNNNNNNNNNNNNNN= ʕNNNNNNNNNNNNNNNNNNNNNNLOPPY DRIVES DB DDPORT3 ENDM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROLLER PRIMITIVES ;++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN=&`3NNNNNNNNNNNNNNNNNNNNNNPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HLa9 NNNNNNNNNNNNNNNNNN=,NNNNNNNNNNNNNNNNNNNNNN#################################################################### JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW=BNNNNNNNNNNNNNNNNNN= NNNNNNNNNNNNNNNNNNNNNNLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,14H ;IF 3" FLOPPY THEN EXIT JP`MNNNNNNNNNNNNNNNNNN= vNNNNNNNNNNNNNNNNNNNNNN++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F5BOOT: EQUWNNNNNNNNNNNNNNNNNNN=MNNNNNNNNNNNNNNNNNNNNN!++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,DDPORT8 IN A,(C) AND A,DDSASW RLCA OR A,HIGH DDBASE LD H,Y 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; Z$NNNNNNNNNNNNNNNNNN= NNNNNNNNNNNNNNNNNNNNNNS SOURCE ; PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PBSTATO ;ONLY XFER PERTINENT BYTES LDIRNNNNNNNNNNNNNNNNNN=&WNNNNNNNNNNNNNNNNNNNNNNHL EXX POP HL LD DE,DDCBO + PBSTATO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HINNNNNNNNNNNNNNNNNN=,NNNNNNNNNNNNNNNNNNNNNNINHIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT2 ; ; SELECT CONTROLLER WINDOW ; EXX LD AarNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN******************************* DCMDERR: LD (IX + PBSTATO),CMDERR ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A REEHNNNNNNNNNNNNNNNNNN= ANNNNNNNNNNNNNNNNNNNNNNRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++J7NNNNNNNNNNNNNNNNNNN=}NNNNNNNNNNNNNNNNNNNNN!; ; CHECK FOR LEGAL COUNT ; LD A,B ;IF COUNT == 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,J !NNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= NNNNNNNNNNNNNNNNNN=$NNNNNNNNNNNNNNNNNNNNNN LDIR ;XFER DATA ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++ GBNNNNNNNNNNNNNNNNNN=!ΔNNNNNNNNNNNNNNNNNNNNNN ; ; EXECUTE THE COMMAND ; LD A,DDEXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN 1NNNNNNNNNNNNNNNNNN='d2NNNNNNNNNNNNNNNNNNNNN!L LD BC,PBSTATO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,IOPBSZ - PBSTATO ; ; UPLOAD STATUS BYTES ; NNNNNNNNNNNNNNNNNNN=-NNNNNNNNNNNNNNNNNNNNNN,DDMB0 JP JT2A ;COMMON WITH WRITE SECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN=7NNNNNNNNNNNNNNNNNNNNNNT ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; ;********VNNNNNNNNNNNNNNNNNN= NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;BHNNNNNNNNNNNNNNNNNN=0NNNNNNNNNNNNNNNNNNNNNNT1B ; LDIR ;XFER DATA ; ; REMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ENNNNNNNNNNNNNNNNNN=RNNNNNNNNNNNNNNNNNNNNNN? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; CHECK FOR XFER INHIBIT ; @9NNNNNNNNNNNNNNNNNN=]NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; BNNNNNNNNNNNNNNNNNN="NNNNNNNNNNNNNNNNNNNNNNERROR ; ; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN=(t NNNNNNNNNNNNNNNNNNNNNNLDIR ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + PBSTATO) OR A,A S9NNNNNNNNNNNNNNNNNN=.ުNNNNNNNNNNNNNNNNNNNNNN; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONT.NNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN******************************************************************** JSELERR: LD (IX + PBSTATO),SELERR JP DSKERR ;****NNNNNNNNNNNNNNNNNNNN= 'NNNNNNNNNNNNNNNNNNNNNNIF ERROR THEN QUIT ; ; CHECK FOR XFER INHIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; ; !NNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PBSTATO),IOPBERR ;PASS BACK ERR/NNNNNNNNNNNNNNNNNN=aNNNNNNNNNNNNNNNNNNNNN! BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT2 ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DDMB1 VINNNNNNNNNNNNNNNNNN=lNNNNNNNNNNNNNNNNNNNNNN C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN=#NNNNNNNNNNNNNNNNNNNNNN++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT $NNNNNNNNNNNNNNNNNN=)G=NNNNNNNNNNNNNNNNNNNNNN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 3 JADE COMMAND XFERS FORMAwBNNNNNNNNNNNNNNNNNN=/NNNNNNNNNNNNNNNNNNNNNNROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7NNNNNNNNNNNNNNNNNN=QNNNNNNNNNNNNNNNNNNNNN!************************************************************************ ; ; CONTROLLER NOT SENSED ERROR ; ;****************NNNNNNNNNNNNNNNNNN= .NNNNNNNNNNNNNNNNNNNNNN XFER DATA FROM CONTROLLER ; JT1A: EXX LD A,DDMB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DDMB1 ;OPENHNNNNNNNNNNNNNNNNNN=RNNNNNNNNNNNNNNNNNNNNN!OR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTIOTSrNNNNNNNNNNNNNNNNNN=qNNNNNNNNNNNNNNNNNNNNNNJT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IBNNNNNNNNNNNNNNNNNN=?NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DDMB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) cNNNNNNNNNNNNNNNNNN=$1aNNNNNNNNNNNNNNNNNNNNN! ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JeNNNNNNNNNNNNNNNNNN=*nNNNNNNNNNNNNNNNNNNNNNNT PGM TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; INNNNNNNNNNNNNNNNNN=0NNNNNNNNNNNNNNNNNNNNN!+++++++++ JTYPE4: EQU JEX ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JAD!BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁn= ۅzI牶U$Ža1ϒn= ۖzI皷U$Ÿ`/ͣk: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>dNNNNNNNNNNNNNNNNNNNNNNE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; E" NNNNNNNNNNNNNNNNNN>8NNNNNNNNNNNNNNNNNNNNN!ER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE9NNNNNNNNNNNNNNNNNN> !NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; Hard disk boot function. ; This module re NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; =a NNNNNNNNNNNNNNNNNN>DNNNNNNNNNNNNNNNNNNNNNN ; LD HL,(DEFBFR + HDBIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY LD H,0 INC HL ;CONVERT TO SECTOR FROM SECTOR -1 EXX |INNNNNNNNNNNNNNNNNN>DNNNNNNNNNNNNNNNNNNNNNNRETURN NO ERRORS OR A JP DKRET ENDIF SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN>%NNNNNNNNNNNNNNNNNNNNN!SECO) LD B,(IX + PBSECO + 1) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (IX + PBSECO),C LD (IX#|NNNNNNNNNNNNNNNNNN>+NNNNNNNNNNNNNNNNNNNNN! ; CLEAR COMMAND ISSUED. RESET THE CONTROLLER ; ISHACLR: LD A,1 SHL HRESET ;ISSUE CONTROLLER RESET OUT (HCMD),A XOR ܻNNNNNNNNNNNNNNNNNNN>1NNNNNNNNNNNNNNNNNNNNNNXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPENNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO 6NNNNNNNNNNNNNNNNNN>tNNNNNNNNNNNNNNNNNNNNNNads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;****************************NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PBSECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,DDCLR NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PBSECO),HL ; CALL ISHAX ;LOAD IN CBIrHNNNNNNNNNNNNNNNNNN> QINNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS &NNNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNN! + PBSECO + 1),B ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; OUTPUT THE IOPB ADDR $NNNNNNNNNNNNNNNNNN>,$NNNNNNNNNNNNNNNNNNNNNNA,A OUT (HCMD),A ; CLRWT: IN A,(HSTATUS) ;WAIT FOR CONTROLLER READY BIT HBUSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILzNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;+++++++++++++++++++@QNNNNNNNNNNNNNNNNNN> 7NNNNNNNNNNNNNNNNNNNNNNMONITOR OR L JP Z,DSKERR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DDSHLT JR NZ,JWAIT1 ; RET ;Z NNNNNNNNNNNNNNNNNNN>GNNNNNNNNNNNNNNNNNNNNNN************************************************ H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUdNNNNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNNN LD (IOPB + PBCMDO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOA'NNNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNN!OS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS RET NZ ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CBNNNNNNNNNNNNNNNNNN>!bxNNNNNNNNNNNNNNNNNNNNNN; BC= SECTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTRO8NNNNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNN!ESS TO HOST ADAPTER ; LD A,C OUT (HDATA),A LD A,HIOPBL OUT (HCMD),A CALL HWBUSY ; LD A,B OUT (HDATA),A LD A,HINNNNNNNNNNNNNNNNNNNN>-'NNNNNNNNNNNNNNNNNNNNNNE IN CASE ISHA FOOLING WITH STATUS PORT ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(HSTATUS) BIT HBUSYB,A JR N$rNNNNNNNNNNNNNNNNNN>kNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OU$NNNNNNNNNNNNNNNNNN> dNNNNNNNNNNNNNNNNNNNNN!RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUsdNNNNNNNNNNNNNNNNNN>TNNNNNNNNNNNNNNNNNNNNNNT (C),A INC C DJNZ H8B1 ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; /NNNNNNNNNNNNNNNNNN>zNNNNNNNNNNNNNNNNNNNNNNG-ON ; LD A,DDLOG LD (IOPB + PBCMDO),A ; CALL ISHAX CALL DQERR RET NZ ; ; NOW READ THE DIRECTORY SECTOR ; LD NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNN!ALL ISHAX CALL DQERR RET NZ ; LD HL,(IOPB + PBSECO) ;NEXT SECTOR INC HL LD (IOPB + PBSECO),HL ; LD HL,(IOPB + PBDM 3NNNNNNNNNNNNNNNNNNNN>"7+NNNNNNNNNNNNNNNNNNNNNNLLER PRESENT ; IN A,(HSTATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + PBDRVO) CP A&NNNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNNNOPBH OUT (HCMD),A CALL HWBUSY ; XOR A,A OUT (HDATA),A LD A,HIOPBX OUT (HCMD),A CALL HWBUSY ; ; OUTPUT THE EXEBNNNNNNNNNNNNNNNNNN>.rFNNNNNNNNNNNNNNNNNNNNN!Z,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL HERRB) OR (1 SHL HFERRB) LD BNNNNNNNNNNNNNNNNNN>ZNNNNNNNNNNNNNNNNNNNNNNTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++:NNNNNNNNNNNNNNNNNNN> UNNNNNNNNNNNNNNNNNNNNNNBTTL MICROMATION PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIYNNNNNNNNNNNNNNNNNN>gNNNNNNNNNNNNNNNNNNNNNN LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 t9NNNNNNNNNNNNNNNNNN>KNNNNNNNNNNNNNNNNNNNNNN(IX + PBCMDO),DDRDS ; EXX LD A,B EXX LD HL,HDIRSEC + 1 ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BNNNNNNNNNNNNNNNNNN>"NNNNNNNNNNNNNNNNNNNNNNAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD -NNNNNNNNNNNNNNNNNN>#NNNNNNNNNNNNNNNNNNNNNN,DDCLR JR Z,ISHACLR ; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + PBDRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUBNNNNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNNNCUTE IOPB COMMAND ; LD A,HEXEC OUT (HCMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC LD (IX + PBSECO),C LD (INNNNNNNNNNNNNNNNNN>/AwNNNNNNNNNNNNNNNNNNNNNN(IX + PBSTATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(HDATA) LD (IX + PBSTATO),A ;RETURN NO ERR! NNNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLX9rNNNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNNVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOTȰNNNNNNNNNNNNNNNNNN>2NNNNNNNNNNNNNNNNNNNNNN PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOPB + PBDRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODDU%NNNNNNNNNNNNNNNNNN>uNNNNNNNNNNNNNNNNNNNNN!C LD (IOPB + PBSECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR RET NZ ; ; LOAD THE CBIOSNNNNNNNNNNNNNNNNNN>wNNNNNNNNNNNNNNNNNNNNNN(BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN jNNNNNNNNNNNNNNNNNN>$NNNNNNNNNNNNNNNNNNNNNN A,4 LD (IX + PBDRVO),A ; ; TEMPORARILY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGED ; LD C,(IX + PBNNNNNNNNNNNNNNNNNN>*NNNNNNNNNNNNNNNNNNNNNNX + PBSECO + 1),B ; POP AF LD (IX + PBDRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PBSTATO) OR A,A RET ; ;NNNNNNNNNNNNNNNNNN>0R:NNNNNNNNNNNNNNNNNNNNNNORS FOR NOW OR A,A RET ;**************************************************************************** ; ; HWBUSY SUBR B!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅtCተO썻Y)ǒd3іo> ۚzI瞶S"^-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>SNNNNNNNNNNNNNNNNNNNNNNWAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;*************************************************** NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNHL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ;SAVE START ADDRESS ; DEC HL ;FETCH BIOS LENGTH LD B,(HL) DEC HL LD C,(HL=NNNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNNIOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;***********************************************************************NNNNNNNNNNNNNNNNNN>6NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++ DBERR: ; ; NEW LINE ; CALL CRLF ; ; OUTPUT TEXT ; LD HL,DERM CALL P|NNNNNNNNNNNNNNNNNN>tNNNNNNNNNNNNNNNNNNNNNNTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; JNNNNNNNNNNNNNNNNNN>sNNNNNNNNNNNNNNNNNNNNNN*********************************** CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;*****************************************0rNNNNNNNNNNNNNNNNNN>%NNNNNNNNNNNNNNNNNNNNNNGES ; ;############################################################################ DERM: DM 'Disk Error, Status = ' ;##vdNNNNNNNNNNNNNNNNNN>+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN************************* HWBUSY: IN A,(HSTATUS) ;WAIT FOR DONE BIT HBUSYB,A JR NZ,HWBUSY RET ;+++++++++++++++++++++/NNNNNNNNNNNNNNNNNN>6NNNNNNNNNNNNNNNNNNNNNN) LD (BIOSLN),BC ;SAVE IT ; LD HL,DEFBFR ;MOVE THIS SECTOR TO PROPER PLACE LD BC,SECSIZ LDIR ; LD (IOPB + PBDMAO),DE[rNNNNNNNNNNNNNNNNNN>CNNNNNNNNNNNNNNNNNNNNN!***** IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,IOPBSZ LDIR RET ;++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNNNUTS ; ; OUTPUT STATUS BYTES ; PUSH IX POP HL LD DE,PBSTATO ADD HL,DE LD B,PBST5O - PBSTATO + 1 ; DBTE1: LD A,(H?[NNNNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNNN POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO -$NNNNNNNNNNNNNNNNNN> fyNNNNNNNNNNNNNNNNNNNNNN*********************************** ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ?uNNNNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNN########################################################################## ; ; LOGIN IOPB ; ;###############################cgNNNNNNNNNNNNNNNNNN>,#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>5NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN m5dNNNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNN! ;SET UP NEW DMA ADDRESS ; INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SECTOq,BNNNNNNNNNNNNNNNNNN>pNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? zyBNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNL) CALL HTOA CALL SPACE INC HL DJNZ DBTE1 ; CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA CALL SPACE NNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNCONSOLE OUTPUT ; ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ~NNNNNNNNNNNNNNNNNN>!UHNNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** PUTS: LD C,(HL) RES 7,C CALL CO ; BIT6cNNNNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNN!############################################# LOGIOPB: DB DDLOG ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW 0 ;SECTOR/SIDE 9NNNNNNNNNNNNNNNNNN>-%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>[NNNNNNNNNNNNNNNNNNNNNNDEFBFR ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++PLNNNNNNNNNNNNNNNNNN> TNNNNNNNNNNNNNNNNNNNNNNR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H RL{dNNNNNNNNNNNNNNNNNN>cNNNNNNNNNNNNNNNNNNNNNN; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DQERR: LD A,(IX + PBSTATO) ;CHECK FOR ERROR NNNNNNNNNNNNNNNNNN>JNNNNNNNNNNNNNNNNNNNNNN EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXX CALL HTOA ; CALL CRLF JP DSKERR SUBTTL ASo NNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNN; ENTRY- C= CHAR ; EXIT - AF= ? ; ;**************************************************************************** CO: IN A,(NTNNNNNNNNNNNNNNNNNN>"NNNNNNNNNNNNNNNNNNNNNN 7,(HL) RET NZ ; INC HL JR PUTS ;**************************************************************************** ; ; Y NNNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNNN DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DB 0,0,0,0 ;STATUS DW 128 ;XFER COUNT IF ($ < PROMST) OR ($ >9NNNNNNNNNNNNNNNNNN>.EvNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>jNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++ STUPBIOS: LD A,(DEFBFR + 1) ;FETCH BIOS LOAD PARAMETERS CP A,SECSIZ ;CHECK LIMITS OF OFFSET CCF RET C RHNNNNNNNNNNNNNNNNNNN> eNNNNNNNNNNNNNNNNNNNNN! H LD A,H DEC A ;ALREADY HAVE 1ST SECTOR LD (BIOSLN),A ;PUT INTO VAR ; ; RETURN NO ERROR ; OR A,A RET ;******rNNNNNNNNNNNNNNNNNN>PNNNNNNNNNNNNNNNNNNNNNNOR A,A RET Z ; ; FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"BNNNNNNNNNNNNNNNNNN>{NNNNNNNNNNNNNNNNNNNNNNCII CHAR ROUTINES ;**************************************************************************** ; ; CONVERT BINARY NIBBLE TO  NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNS) ;IF BUSY THEN WAIT AND A,1 SHL NTBSY JR NZ,CO ; LD A,C OUT (NTD),A RET ;************************************NNNNNNNNNNNNNNNNNN>#3*NNNNNNNNNNNNNNNNNNNNNNOUTPUT SPACE TO CONSOLE SUBR ; ;**************************************************************************** SPACE: LD C,' ' ZNNNNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNN! (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END dBNNNNNNNNNNNNNNNNNN>/vGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>9NNNNNNNNNNNNNNNNNNNNNN; LD HL,DEFBFR ;COMPUTE OFFSET TO CBIOS VECTORS LD E,A LD D,0 ADD HL,DE ; DEC HL ;FETCH BIOS LOAD ADDRESS LD D,(rNNNNNNNNNNNNNNNNNN> %NNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= E NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN+++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;+++++++++++++++++++++++++++++++++wNNNNNNNNNNNNNNNNNN>ENNNNNNNNNNNNNNNNNNNNNNASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;**************************************************************************** HNNNNNNNNNNNNNNNNNN>@NNNNNNNNNNNNNNNNNNNNN!**************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;*****************************************srNNNNNNNNNNNNNNNNNN>$NNNNNNNNNNNNNNNNNNNNNN JR CO SUBTTL INITIALIZED DATA ;############################################################################ ; ; MESSANNNNNNNNNNNNNNNNNN>*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN>0e NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNсo> ܅zI牶T#`/͒k: ؖvE䚴R!𞿟],ʣh7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN?*NNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 MONITOR LIST NOCOND ;**************************************************************************** ; ; SYSTE NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNurning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing t NNNNNNNNNNNNNNNNNN? WGNNNNNNNNNNNNNNNNNNNNNNfinitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUGBNNNNNNNNNNNNNNNNNN?w;NNNNNNNNNNNNNNNNNNNNNN************************************* FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*2: NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN ; ; ; BREAKPOINTS ; NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 ;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BRE$NNNNNNNNNNNNNNNNNN?2VNNNNNNNNNNNNNNNNNNNNNNRESTART ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; MEMORY BANK DATA IN PAGE 0 BNNNNNNNNNNNNNNNNNN?%NNNNNNNNNNNNNNNNNNNNNNRG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILOC DS 1 ;I YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOCJNNNNNNNNNNNNNNNNNN?+NNNNNNNNNNNNNNNNNNNNNNRT INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTS DS BP_REC ENDM ; ; BANK #S ASSOCIATNNNNNNNNNNNNNNNNNN?GyNNNNNNNNNNNNNNNNNNNNNNM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;******************************************************** NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNo boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing tNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN 86 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restoreINNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!MACLIB ASMBTOOL.MLB ;*INCLUDE ZMONROM.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE CLOKROM.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOA9NNNNNNNNNNNNNNNNNN?ͣNNNNNNNNNNNNNNNNNNNNN!AKPOINT RESTART VECTOR LOCATION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTION ; ; MONITOR FUNCTION CALL ; MFUNRST S$NNNNNNNNNNNNNNNNNN? 'NNNNNNNNNNNNNNNNNNNNNN ; THIS_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;STACK PTR WHILE THIS BANK IS SELECTED PREV_BNK E GNNNNNNNNNNNNNNNNNN?&[NNNNNNNNNNNNNNNNNNNNN! 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 DS 1 ;H' ELOC RTNNNNNNNNNNNNNNNNNN?,bNNNNNNNNNNNNNNNNNNNNNNED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ARG #1 BANK A2_BNK DS 1 A3_BNK DS 1 SUBT2NNNNNNNNNNNNNNNNNN?tHNNNNNNNNNNNNNNNNNNNNNN******************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program 6$NNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNN!the status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BI;bNNNNNNNNNNNNNNNNNNN?1%NNNNNNNNNNNNNNNNNNNNNN routine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ;/GNNNNNNNNNNNNNNNNNN?ݝNNNNNNNNNNNNNNNNNNNNNNRD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE PRI.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF ۙyNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNEQU 20H ;FUNCTION RESTART VECTOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTIOWBNNNNNNNNNNNNNNNNNN?!NNNNNNNNNNNNNNNNNNNNN!QU 001EH ;LINK BACK TO PREVIOUS BANK ;============================================================================ ; ; 6rNNNNNNNNNNNNNNNNNN?'jNNNNNNNNNNNNNNNNNNNNN!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 HLOC DS 1 ;H PLO9NNNNNNNNNNNNNNNNNN?-QNNNNNNNNNNNNNNNNNNNNNNTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ; ; COLD START VECTOR ; PHASECK MR_CBOOT CBOOT JP INIT ;COLD START ; ;rNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNbreakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as xNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNN!TS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reG[NNNNNNNNNNNNNNNNNN?"hNNNNNNNNNNNNNNNNNNNNNN ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines. ; ; 1.12 20 JUL 88 GRH ; Add Monitor function call restar\!NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN *INCLUDE DKBTROM.DEF *INCLUDE CLOKROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF NNNNNNNNNNNNNNNNNN?gNNNNNNNNNNNNNNNNNNNNNNN RESTART INSTRUCTION ; ; BANK SELECTION ; BNKREG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) DEF29NNNNNNNNNNNNNNNNNN?"ANNNNNNNNNNNNNNNNNNNNNN CONSTANTS ; ;============================================================================ CTRLS EQU 13H ;ASCII DC3 CR EQVNNNNNNNNNNNNNNNNNN?(TNNNNNNNNNNNNNNNNNNNNNNC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DS 1 ;CURRENT EXECUTION BANK DBANK DS 1 ;DESTIN'WNNNNNNNNNNNNNNNNNNNN?.NNNNNNNNNNNNNNNNNNNNNN CHARACTER I/O (6) ; PHASECK MR_CONIN STDIN: CONIN JP CI ;CONSOLE INPUT JP MONFUNC ;EXECUTE FUNCTION PHASECK MR_CONPNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!this ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RNNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-BBNNNNNNNNNNNNNNNNNN?YNNNNNNNNNNNNNNNNNNNNNNt. ; ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0FNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN *INCLUDE PRI.DEF LIST ON ;============================================================================ ; ; ASSEMBLE T NNNNNNNNNNNNNNNNNN?T4NNNNNNNNNNNNNNNNNNNNNNBNK EQU 0 ;DEFAULT Z-80 EXECUTION BANK ; ; MONITOR ADDRESSES ; MONROM EQU 0F800H ;ROM START ADDR DK_ROM EQU DK_RNUM ONNNNNNNNNNNNNNNNNN?#rNNNNNNNNNNNNNNNNNNNNNNU 0DH LF EQU 0AH BELL EQU 7 ;============================================================================ ; ; VARIAKNNNNNNNNNNNNNNNNNN?)eNNNNNNNNNNNNNNNNNNNNNNATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0: NOT, /0: CHANGED) ; ; BREAKPDDNNNNNNNNNNNNNNNNNN?/7NNNNNNNNNNNNNNNNNNNNNNOUT STDOUT: CONOUT JP CO ;CONSOLE OUTPUT RET ;WAS PUNCH DS 2 PHASECK MR_LSTOUT STDLST: LIST JP LO ;LIST OUTPUT P;NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNelease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before t`INNNNNNNNNNNNNNNNNN? dvNNNNNNNNNNNNNNNNNNNNNNboot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE deINNNNNNNNNNNNNNNNNN?D NNNNNNNNNNNNNNNNNNNNNN8H. ; ; 1.21 27 JAN 89 GRH ; Add new monitor function routines. ; VERSN EQU 120 ;***************************************CNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNIME VARIABLES ; ;============================================================================ ; ; ASSEMBLY-TIME CONSTANTS 9NNNNNNNNNNNNNNNNNN?gNNNNNNNNNNNNNNNNNNNNNN;ROM # OF DISK ROM XDBROM EQU DK_RNUM ;DEFAULT BOOT ROM # ; ; PAGE 0 LOCATIONS ; WSVEC EQU 0 ;VECTOR NUMBER FOR WARM NNNNNNNNNNNNNNNNNN?$9NNNNNNNNNNNNNNNNNNNNNNBLES ; ;============================================================================ ; ; SAVE 128 BYTES FOR MONITOR ; O= ROM NUMBER ; ;------------------------------------------------------=9NNNNNNNNNNNNNNNNNN? `wNNNNNNNNNNNNNNNNNNNNNN STORE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; DONE ; RET ;*********************************************************LrNNNNNNNNNNNNNNNNNN?@ NNNNNNNNNNNNNNNNNNNNN!UNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBANK) ;RESELECT CURRENT BAUNNNNNNNNNNNNNNNNNN?fNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXIT -NNNNNNNNNNNNNNNNNN?%8NNNNNNNNNNNNNNNNNNNNNN************************************************************* PUTMEM: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENT BANK TNNNNNNNNNNNNNNNNNN?+7NNNNNNNNNNNNNNNNNNNNNN 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 ; ; RESTORE A(NNNNNNNNNNNNNNNNNN?pINNNNNNNNNNNNNNNNNNNNNNCT MEMORY BANKS FOR MOVE (WAS RTS) JP BMOVE ;MEMORY BLOCK MOVE (WAS RTS) DS 3 ;XBANK ;EXECUTE BANK FUNCTION ; ; MORE CrNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN---------------------- DS 2 SWPROM: PUSH AF ;BALANCE STACK IN CASE SWAP NOT DONE IF $ <> MR_XOVER CONMSG **** WARNING!U NNNNNNNNNNNNNNNNNN?5$NNNNNNNNNNNNNNNNNNNNNN******************* ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; ENTRY- B= SOURCE BANK ; C= DESTINATION INNNNNNNNNNNNNNNNNN?ٜNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE ; LD A,(BNKCHG) OR A,A JdNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNNK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DISCRETE MOVE ; NTSAME: ]NNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNN A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETMEM: ; ; SAVE REGISTER ; PBNNNNNNNNNNNNNNNNNN?&kNNNNNNNNNNNNNNNNNNNNNNO RETURN TO ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUT (BNKREG NNNNNNNNNNNNNNNNNN?,UNNNNNNNNNNNNNNNNNNNNNNRGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; mrNNNNNNNNNNNNNNNNNN?CxNNNNNNNNNNNNNNNNNNNNNNHARACTER I/O ; PHASECK MR_LSTSTS STDLSTS: LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN ; ; MONITOR PROCEDURE VECTORS #NNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNN Xover Address Mismatch! **** ENDIF OUT (M2_RSEL),A POP AF RET SUBTTL MEMORY MANAGEMENT ROUTINES ;*************vwNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNBANK ; EXIT - A= ? ; ;**************************************************************************** XMOVE: ; ; STORE BANKg!NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMOVE2: ; ; SAVE CURRENNNNNNNNNNNNNNNNNNN?ɢNNNNNNNNNNNNNNNNNNNNNN; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK) ; ; NO INTERRUPTS WH!NNNNNNNNNNNNNNNNNN?!#NNNNNNNNNNNNNNNNNNNNNNUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS NNNNNNNNNNNNNNNNNN?'ZNNNNNNNNNNNNNNNNNNNNNN),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI ; ; DONE ; POP BC RET <NNNNNNNNNNNNNNNNNN?-fNNNNNNNNNNNNNNNNNNNNNN MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONINNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN; JP REST ;BREAKPOINT ENTRY DS 3 ;EXIT ;EXECUTE REGISTERS PROCEDURE (GOTO) ; DS 3 ;RESTART ERROR ENTRY SUBTTL MONINNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNN*************************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CNNNNNNNNNNNNNNNNNN?XNNNNNNNNNNNNNNNNNNNNN! #S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET ;+++++++++++++++++NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNT BANK # ; LD A,(THIS_BNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR A,A LD (BNKCHG),A ; ;~WNNNNNNNNNNNNNNNNNN?P5NNNNNNNNNNNNNNNNNNNNNNILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A,(HL) EX AF,AF' ; 'wNNNNNNNNNNNNNNNNNN?"vNNNNNNNNNNNNNNNNNNNNN! OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; ; RETURN DATA ; LDmNNNNNNNNNNNNNNNNNN?(dNNNNNNNNNNNNNNNNNNNNNN SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NNNNNNNNNNNNNNNNNNN?.3NNNNNNNNNNNNNNNNNNNNNNTOR FUNCTION TABLE ; ;############################################################################ FUNTABL: DW RETVERS ;0: NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNTOR BOARD SHADOW ROM SELECTION PROCEDURE ;---------------------------------------------------------------------------- ; ; EXv"NNNNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNP/M 3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;*********)!NNNNNNNNNNNNNNNNNN?&iNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ; NOTE: THIS FUNCTION IS NOT S[ NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN IF IN SAME BANK THEN USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP A,L POP HL ;PTR JP QLNNNNNNNNNNNNNNNNNN?cNNNNNNNNNNNNNNNNNNNNNN LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE INC DE ; EXX ;CHECK FtrNNNNNNNNNNNNNNNNNN?#ENNNNNNNNNNNNNNNNNNNNNN A,C ; ; DONE ; POP BC EI RET ;**************************************************************************** ; ڶHNNNNNNNNNNNNNNNNNN?)UNNNNNNNNNNNNNNNNNNNNNN; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MONFUNC: CP A,MAXFUN\NNNNNNNNNNNNNNNNNN?/NNNNNNNNNNNNNNNNNNNNNN RETURN MONITOR ROM VERSION ; DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNECUTE SHADOW ROM FUNCTION ; THE OUTPUT INSTRUCTION IN THE FOLLOWING CODE MUST RESIDE AT THE ; ADDRESS JUST PRIOR TO THE ROM, NNNNNNNNNNNNNNNNNN? SFNNNNNNNNNNNNNNNNNNNNNN******************************************************************* BNKSEL: ; ; SELECT NEW BANK ; OUT (BNKREG),A ; ; INNNNNNNNNNNNNNNNNN?s:NNNNNNNNNNNNNNNNNNNNNNCP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COٔ9NNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNNZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;A STILL HAS BANK (BOTH SAӬ9NNNNNNNNNNNNNNNNNN?6WNNNNNNNNNNNNNNNNNNNNNNOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;++++++++++++++++++++++++++++++++++++++mNNNNNNNNNNNNNNNNNN?$ NNNNNNNNNNNNNNNNNNNNNN; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;***************ONNNNNNNNNNNNNNNNNNNN?*NNNNNNNNNNNNNNNNNNNNNNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD"NNNNNNNNNNNNNNNNNN?0NNNNNNNNNNNNNNNNNNNNNNUNERR ;3: SPARE DW XMOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: EXECUTE BANK ; DW M0dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNсo> ܅zI牶T#Ža0ϒn= ܖzI皷U$Ÿ`/ͣk: nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNFUNERR ;7: EXECUTE CHAR DEVICE DRIVER FUNCTIONS DW D_FUNS ;8: EXECUTE DISK DEVICE DRIVER FUNCTIONS DW V_FUNS ;9: EXECUTE INNNNNNNNNNNNNNNNNN@.NNNNNNNNNNNNNNNNNNNNNNROM # ; LD A,CLK_ROM ; ; GO EXECUTE THE ROM ENTRY ; JP SWPROM ;++++++++++++++++++++++++++++++++++++++++++++++++++"yNNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNNITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IpZBNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MOX)NNNNNNNNNNNNNNNNNN@kNNNNNNNNNNNNNNNNNNNNNN ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOC LD B,BNKLOC - RLOC + 1 ; INIT2: LD (HL),C ;C HAS 0 FROM LAST LDIR FINIʼnNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,WINIT PUSH HL ; ; RESTORE THE WARM START RESTART VECTOR IN PAGE 0 ; LD (WSRBNNNNNNNNNNNNNNNNNN@%NNNNNNNNNNNNNNNNNNNNNNNS IN DEFAULT OF 2 ARGUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ;------------------------------------------------[NNNNNNNNNNNNNNNNNN@+mNNNNNNNNNNNNNNNNNNNNN!THEN USE DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JR C,BOOTCD ; ; ELSE GET USER ARG ; CALL EXF ;GQNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNMISC DEVICE DRIVER FUNCTIONS ; DW D_EXIOPB ;10: EXECUTE IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS 9NNNNNNNNNNNNNNNNNN@>)NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN!NIT CODE ; ;---------------------------------------------------------------------------- INIT: ; ; INSURE INTERRUPTS DISAgINNNNNNNNNNNNNNNNNN@x7NNNNNNNNNNNNNNNNNNNNN!NSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;STARu9NNNNNNNNNNNNNNNNNN@[8NNNNNNNNNNNNNNNNNNNNNNSH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC TO 0100H ; LD HL,0100H LD (PLOC),HL LD (SLOC),HL ; ; INSERT I/O I}l^NNNNNNNNNNNNNNNNNN@ fNNNNNNNNNNNNNNNNNNNNN!VEC + 1),HL LD A,0C3H LD (WSVEC),A ; ; INIT FUNCTION CALL VECTOR ; LD HL,MONFUNC LD (MFUNRSV + 1),HL LD (MFUNRSV) NNNNNNNNNNNNNNNNNN@&NNNNNNNNNNNNNNNNNNNNNN---------------------------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO CLI ; ;--------------------------------------------ZNNNNNNNNNNNNNNNNNN@, NNNNNNNNNNNNNNNNNNNNNNET USER BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RE׊NNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSIO $NNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ D_FUNS: ; ; SET ROM # ; LD A,XDBROM AND 7 ; ; GO EXECUTE THE ROM ENTRY ; wNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNBLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVEW[rNNNNNNNNNNNNNNNNNN@KNNNNNNNNNNNNNNNNNNNNNNT WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC DNNNNNNNNNNNNNNNNNN@h NNNNNNNNNNNNNNNNNNNNNNNIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ; ; FALL INTO WARM START LONNNNNNNNNNNNNNNNNNNN@!WNNNNNNNNNNNNNNNNNNNNN!,A ; ; INIT BREAKPOINT VECTOR ; LD HL,REST LD (BP_RSTV),A LD (BP_RSTV +1),HL ; ; GET COMMAND FROM USER ; CALL tNNNNNNNNNNNNNNNNNN@'(NNNNNNNNNNNNNNNNNNNNNN-------------------------------- QPRT: ; ; DISPLAY ERROR PROMPT ; LD HL,QMSG CALL PRTWA ; ; EXECUTE WARM RESTART dNNNNNNNNNNNNNNNNNNN@-:NNNNNNNNNNNNNNNNNNNNNNTURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROR$NNNNNNNNNNNNNNNNNN@{DNNNNNNNNNNNNNNNNNNNNNNN # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERS: LD HL,VERSN RENNNNNNNNNNNNNNNNNN@ XKNNNNNNNNNNNNNNNNNNNNNNJP SWPROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONHNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN DD WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKȟNNNNNNNNNNNNNNNNNNN@UNNNNNNNNNNNNNNNNNNNNNNE ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYT NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNOP ; ;---------------------------------------------------------------------------- ; ; THE WARM START CODE ; ;--------9rNNNNNNNNNNNNNNNNNN@"NNNNNNNNNNNNNNNNNNNNN!CRLF CALL DECHO ; ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR C,QPRT ; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; NNNNNNNNNNNNNNNNNN@(8NNNNNNNNNNNNNNNNNNNNN!; JR WINIT SUBTTL COMMANDS ;---------------------------------------------------------------------------- ; ; BOOT COMNNNNNNNNNNNNNNNNNN@.iNNNNNNNNNNNNNNNNNNNNNNOM ADDR ; BOOTCC: LD D,1 ;SET BOOT FUNCTION # LD A,C ;BITS 2..0 = ROM # AND A,7 ;MASK OF EXTRANEOUS BITS & CLEAR ERROR NNNNNNNNNNNNNNNNNN@HuNNNNNNNNNNNNNNNNNNNNNNT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENT6NNNNNNNNNNNNNNNNNNN@ kzNNNNNNNNNNNNNNNNNNNNNNS ; ENTRY- IX= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ D_EXIOPB: ; ; SEBNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNREG),A ; ; SET MONITOR COMMAND ARGUMENT DEFAULTS ; LD HL,A1_BNK LD (ARGPTR),HL LD (HL),A ;A STILL HAS DEFAULT BANK #NNNNNNNNNNNNNNNNNN@-dNNNNNNNNNNNNNNNNNNNNNNV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; FILL BREAKPOINT ADDRESSES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[N7 NNNNNNNNNNNNNNNNNN@¯NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------------------------- WINIT: ; ; FIRST RESTORE THE LOCAL STACK TO THE GLOBAL9NNNNNNNNNNNNNNNNNN@#5NNNNNNNNNNNNNNNNNNNNNN USE COMMAND CHAR AS OFFSET TO TABLE OF COMMAND EXECUTION ADDRESSES ; ADD A,A ;OFFSET = INDEX * 2 ; LD E,A LD D,0 LoJNNNNNNNNNNNNNNNNNN@) NNNNNNNNNNNNNNNNNNNNNNMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 6rNNNNNNNNNNNNNNNNNN@/XNNNNNNNNNNNNNNNNNNNNNNFLAG CALL SWPROM ; LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;----------------------------------- NNNNNNNNNNNNNNNNNN@&NNNNNNNNNNNNNNNNNNNNNNRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ V_FUNS: ; ; SET NNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNT ROM # ; LD A,DK_ROM ; ; GO EXECUTE THE ROM ENTRY ; LD D,4 ;SET IOPB EXECUTE FUNCTION 1ST JP SWPROM SUBTTL IS$NNNNNNNNNNNNNNNNNN@ґNNNNNNNNNNNNNNNNNNNNNN INC HL LD (HL),A INC HL LD (HL),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTBNNNNNNNNNNNNNNNNNN@=ZNNNNNNNNNNNNNNNNNNNNNNBKPTS * BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDIR ; ; SET BANK STACK ; LD (THIS_STK),SP ; ^NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN RAM ; LD SP,MONSTK ; ; RESTORE BANK TO DEFAULT BANK ; LD A,DEFBNK CALL BNKSEL ; ; PUT THE RETURN ON THE STACK FkNNNNNNNNNNNNNNNNNN@$}NNNNNNNNNNNNNNNNNNNNN!D HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRESS INC HL LD H,(HL) LD L,A ; LD B,2 ;PASqNNNNNNNNNNNNNNNNNN@*^NNNNNNNNNNNNNNNNNNNNNN (DEFAULT # = 02H) ; ;---------------------------------------------------------------------------- BOOTC: ; ; IF NO ARGS  NNNNNNNNNNNNNNNNNN@0NNNNNNNNNNNNNNNNNNNNNN----------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINF NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNŃj9ׅvE㉲P\+ɒg6ԖsB⚲Q \+ɣh7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F[ ] ; ;---------------------------------------------------------------------------- 'NNNNNNNNNNNNNNNNNN@9[NNNNNNNNNNNNNNNNNNNNNN;DONE IF CARRY ; ; NEXT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EVEN 16 BYTE BOUNDARY THEN REPEAT ; LD A,L $NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN NZ,DIS4 ; ; ELSE NEXT LINE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII ON PROPER COLUMN ; DIS7: SUB A,E ;SKIP .BNNNNNNNNNNNNNNNNNN@%yNNNNNNNNNNNNNNNNNNNNN!ON AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------------------------------------------------wBNNNNNNNNNNNNNNNNNN@+ZNNNNNNNNNNNNNNNNNNNNNNKPOINT FROM USER ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR ; ; IF BREAKPOINTM~NNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNART_ADDR> ; ;---------------------------------------------------------------------------- FILL: ; INNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNATIVE ADDRESS. ; ; V ; ;------------------------------------------NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN2BNK:S2ADR S2DTA POP AF EX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL BLK POP AF EX (SP),HL ; CALL HEX1 ;NNNNNNNNNNNNNNNNNN@ONNNNNNNNNNNNNNNNNNNNNNDISP: ; ; GET ARGUMENTS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LOOP ; DIS1: ; ; DISPLAY START ADDRESS =rNNNNNNNNNNNNNNNNNN@lNNNNNNNNNNNNNNNNNNNNNN ;READY FOR NEW LINE? AND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASCII ; DIS3: ; ; RESTORE PTR ; POP HLu NNNNNNNNNNNNNNNNNN@ VNNNNNNNNNNNNNNNNNNNNNNOVER TO START ASCII CALL TRPLSP JR DIS3 ;---------------------------------------------------------------------------- hNNNNNNNNNNNNNNNNNN@&,NNNNNNNNNNNNNNNNNNNNNN---------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK JR C,GO3 ; ; IF NO GOTO ADDRESS THEN דINNNNNNNNNNNNNNNNNN@,;NNNNNNNNNNNNNNNNNNNNN! == 0 (NONE) THEN STOP ; LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E JR Z,GO2 ; ; ELSE STORE BREAKPOINT ADDښBNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN!; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DE= LAST ADDR, BC= VALUE ; ; TOP OF FILL LOOP ; FIO: PUSH DE LD DE,(A1_INNNNNNNNNNNNNNNNNN@ :(NNNNNNNNNNNNNNNNNNNNNN---------------------------------- COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL EXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; ([BNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN!OUTPUT S2DTA ; CMPB: POP BC POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILOXB RET C ; ; ELSE REPEAT ; JR CMPHNNNNNNNNNNNNNNNNNNN@|6NNNNNNNNNNNNNNNNNNNNNN; PUSH DE LD DE,(A1_BNK) CALL LADRB POP DE ; ; START DISPLAY ON PROPER COLUMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDAqBNNNNNNNNNNNNNNNNNN@_9NNNNNNNNNNNNNNNNNNNNNN ; ; POSITION START ON PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE AND A,0FH CALL TRPL2 ; ; DISPLAY CHAR ;NNNNNNNNNNNNNNNNNN@!gNNNNNNNNNNNNNNNNNNNNNN; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAD9NNNNNNNNNNNNNNNNNN@'NNNNNNNNNNNNNNNNNNNNNNSET BREAKPOINTS ; JR Z,GO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; PUSH AF ;PRESET BANK # LD A,(BNKLO:!NNNNNNNNNNNNNNNNNN@- NNNNNNNNNNNNNNNNNNNNNNRESS IN TABLE ; LD (HL),E ;SAVE BP ADDR INC HL ; LD (HL),D INC HL ; LD A,(A1_BNK) LD (HL),A INC HL ; ; SAVƺdNNNNNNNNNNNNNNNNNN@LtNNNNNNNNNNNNNNNNNNNNNNBNK) CALL PUTMEM ;STORE THE FILL VALUE POP DE ; ; IF NOT LAST LOCATION THEN REPEAT ; CALL HILO JR NC,FIO ; ; EȜrNNNNNNNNNNNNNNNNNN@ o{NNNNNNNNNNNNNNNNNNNNNN TOP OF VERIFY LOOP ; CMPA: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS EX (SP),HL ; ; FETCH SRC2 DATA ; NNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN!A ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROU4zNNNNNNNNNNNNNNNNNN@)eNNNNNNNNNNNNNNNNNNNNNNRY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; PUSH HL ; ; TOP OF HEX DISPLAY LOOP ; ,rNNNNNNNNNNNNNNNNNN@ƮNNNNNNNNNNNNNNNNNNNNNN DIS4: PUSH DE ;FETCH BANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA POP DE ; AND A,7FH ;IF PRINTABLE THEN OUTP%$NNNNNNNNNNNNNNNNNNN@"4NNNNNNNNNNNNNNNNNNNNNNKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXNNNNNNNNNNNNNNNNNN@(NNNNNNNNNNNNNNNNNNNNNNC) LD (A1_BNK),A ; CALL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATION LD A,(A1_BNK) LD (BNKLOC),A ; ; IF9NNNNNNNNNNNNNNNNNNNN@.YNNNNNNNNNNNNNNNNNNNNNNE EXISTING LOCATION DATA IN TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEM EX DE,HL ;HL= PTR ; LD E,A ;E= BANKNNNNNNNNNNNNNNNNNNN@ENNNNNNNNNNNNNNNNNNNNNNLSE DONE ; JR WINIT ;---------------------------------------------------------------------------- ; ; VERIFY MEMORY CO(gNNNNNNNNNNNNNNNNNNNN@ \JNNNNNNNNNNNNNNNNNNNNNNLD DE,(A3_BNK) CALL GETMEM LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,(A1_BNK) CALL GETMEM LD B,A ;GET SOUR6\NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORG:NNNNNNNNNNNNNNNNNNN@TNNNNNNNNNNNNNNNNNNNNNNDIS2: ; ; DISPLAY MEMORY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA FROM E:HL +$NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNUT LD C,A CP A,' ' JR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;ELSE OUTPUT '.' ; DIS6: CALL CONOUT ; ; ! NNNNNNNNNNNNNNNNNN@#NNNNNNNNNNNNNNNNNNNNNNECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTI_NNNNNNNNNNNNNNNNNN@*iNNNNNNNNNNNNNNNNNNNNN!KPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; ; GET BREASqBNNNNNNNNNNNNNNNNNN@0%NNNNNNNNNNNNNNNNNNNNN! C LD C,BP_RSTI CALL PUTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE= PTR POP HL ;HL= RECORD.DATA PTR ; LD \NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNсo> ܅zI牶T#`/͒k: ؖvE䚴R!𞿟],ʣi8~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN(HL),A ;STORE DATA INTO TABLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS THEN DONE WITH BREAKPOINTS ; GO2: LD A,C qNNNNNNNNNNNNNNNNNNAXNNNNNNNNNNNNNNNNNNNNNNAF' EXX ; ; NOW DO THE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) ; LD DE,(ELOC) LD BC,(CLOC) ; ; DO S^ NNNNNNNNNNNNNNNNNNA hNNNNNNNNNNNNNNNNNNNNNNMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----O9NNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN ; DONE ; JP WINIT ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ;n NNNNNNNNNNNNNNNNNNAxNNNNNNNNNNNNNNNNNNNNN!SP),HL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; NEXT, IF SRC <= LAST THEN REPEAT ; CALL HILOXB l$NNNNNNNNNNNNNNNNNNAyNNNNNNNNNNNNNNNNNNNNN!-------- SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF\rNNNNNNNNNNNNNNNNNNA%8'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'NNNNNNNNNNNNNNNNNNA+(NNNNNNNNNNNNNNNNNNNNN!ROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; MTEST1: PUSH DE LD DE,(A1_BNK) CALL GETMEM ;FETCH D?NNNNNNNNNNNNNNNNNNAVNNNNNNNNNNNNNNNNNNNNNN CP A,CR POP BC ;BP COUNT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; DJNZ GO1 ; ; GOT ALL ARGS, EXECTUTE THE G{+ NNNNNNNNNNNNNNNNNNAHNNNNNNNNNNNNNNNNNNNNN!TACK ; LD SP,(SLOC) ; ; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; LD A,(BNKLOC) CALL BNKSEL ; LD HL,(P{*NNNNNNNNNNNNNNNNNNA;NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------ INPT: ; ; GET PORT ARG FROM USER ; CALL EXPR1 1HNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTI/rNNNNNNNNNNNNNNNNNNA-NNNNNNNNNNNNNNNNNNNNNN JR NC,MOV1 ; ; ELSE DONE ; JP WINIT ;---------------------------------------------------------------------------- NNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN LOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USERXBNNNNNNNNNNNNNNNNNNA&mtNNNNNNNNNNNNNNNNNNNNNN HL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL ;PTR = PTR - 1 ; ; IF ON MODULO 8 BOUNDARY, START ObNNNNNNNNNNNNNNNNNNA,NNNNNNNNNNNNNNNNNNNNNNATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ; ; TEST BY XORING WITH DATA, RESULT SHOULD BE 0 ; CANNNNNNNNNNNNNNNNNNAgNNNNNNNNNNNNNNNNNNNNNNOTO ; GO3: CALL CRLF ;NEW LINE FOR PGM ; POP HL ;GET RID OF WINIT RETURN ADDRESS ; ; INSERT RESTART BREAKPOINT VECT INNNNNNNNNNNNNNNNNNA {NNNNNNNNNNNNNNNNNNNNN!LOC) PUSH HL ; ; DO INTERRUPT & REFRESH REGISTERS AS CLOSE TO EXIT AS POSSIBLE ; LD HL,(RLOC) LD A,H LD I,A LD A,69NNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORT DATA ; IN E,(C) JP BITS2 ;OUTPUT VPNNNNNNNNNNNNNNNNNNNA=NNNNNNNNNNNNNNNNNNNNNNNATION 1ST BYTE ADDR. ; ; M ; ;-------------------------------------------------BNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DES89NNNNNNNNNNNNNNNNNNA!NNNNNNNNNNNNNNNNNNNNNN ; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SrNNNNNNNNNNNNNNNNNNA'^ENNNNNNNNNNNNNNNNNNNNN!N NEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; CONTINUE ; JR SUB1 ;--------------------------'NNNNNNNNNNNNNNNNNNA-NNNNNNNNNNNNNNNNNNNNNNLL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERROR) ; CALL NZ,BITS ;LOG ERR IF NOT ; ; RESTORE DATk NNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNOR TO RESTORE ROUTINE ; LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM INC HL LD C,LOW REST CALL PUTMEM INCLNNNNNNNNNNNNNNNNNNA .NNNNNNNNNNNNNNNNNNNNNNL ; ; DO AF ; LD HL,(FLOC) PUSH HL LD R,A ;MINIMIZE REFRESH REGISTER CHANGE POP AF ; ; FINALLY RESTORE HL & EXNNNNNNNNNNNNNNNNNNAGNNNNNNNNNNNNNNNNNNNNNNALUE ;---------------------------------------------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; !9NNNNNNNNNNNNNNNNNNAhNNNNNNNNNNNNNNNNNNNNN!--------------------------- MOVE: ; ; GET ARGS FROM USER ; CALL EXPR3 ;HL= SRC, DE= SRC_LAST, BC= DEST ; ; TOP OF MNNNNNNNNNNNNNNNNNNA*NNNNNNNNNNNNNNNNNNNNNNIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENNNNNNNNNNNNNNNNNNA"NNNNNNNNNNNNNNNNNNNNN!PACE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UwMNNNNNNNNNNNNNNNNNNA(N{NNNNNNNNNNNNNNNNNNNNNN-------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DCNNNNNNNNNNNNNNNNNNNA.NNNNNNNNNNNNNNNNNNNNN!A IN MEMORY ; POP AF ;RESTORE BYTE LD C,A CALL PUTMEM POP DE ; ; IF NOT DONE THEN REPEAT ; CALL HILOX JR NC,MSqNNNNNNNNNNNNNNNNNNA>NNNNNNNNNNNNNNNNNNNNNN HL LD C,HIGH REST CALL PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTES THE 'PC' ; ; FIRST RESTO NNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNN!ECUTE THE REQUESTED CODE ; LD HL,(LLOC) ; ; RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACBNNNNNNNNNNNNNNNNNNAvNNNNNNNNNNNNNNNNNNNNNN O ; ;---------------------------------------------------------------------------- OUPT: ; ; t:NNNNNNNNNNNNNNNNNNA[NNNNNNNNNNNNNNNNNNNNNNOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC ;SAVE DEST PTR ; LD DE,(A1_BNK) ;FETCHEHNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNN!NTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE UrNNNNNNNNNNNNNNNNNNA#NNNNNNNNNNNNNNNNNNNNNNP ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE H\ NNNNNNNNNNNNNNNNNNA)}JNNNNNNNNNNNNNNNNNNNNNNATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;--------------------------------------------------------------------NNNNNNNNNNNNNNNNNNA$ NNNNNNNNNNNNNNNNNNNNNNEX INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ;0rNNNNNNNNNNNNNNNNNNA*(NNNNNNNNNNNNNNNNNNNNNNRT_ADDR> ; ;---------------------------------------------------------------------------- MTEST: ; ; GET ARGS FۧNNNNNNNNNNNNNNNNNNA0ġNNNNNNNNNNNNNNNNNNNNN!E REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIM NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃk: ؅vE㉲P\+ɒg6֖tCᚱOힼZ)ǣe4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA5NNNNNNNNNNNNNNNNNNNNN!FIED 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 BNNNNNNNNNNNNNNNNNNAoNNNNNNNNNNNNNNNNNNNNN! IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, TRY AGAIN ; ; CHARS MATCH, SET UP TO DISPLAY CURRENT DAgrNNNNNNNNNNNNNNNNNNA XNNNNNNNNNNNNNNNNNNNNN!TMEM POP BC JR XE ; ; ; WORD REGISTER WRITE ; XWREG: EX (SP),HL ;HL= DATA EX DE,HL ;DE= DATA, HL= PTR INC HL ;s~dNNNNNNNNNNNNNNNNNNA$NNNNNNNNNNNNNNNNNNNNNNTBL ;ADDR OF REG LOOK-UP TABLE ; ; IF NO ARGS THEN DISPLAY ALL REGS ; XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;-----------------------------------------------------------------------$NNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNTA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; CALL PCHK ; ; IF USER ENTERED CR THEN DONE ; RET C M)rNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNPRTVAL LEFT PTR TO LOW BYTE -1 LD (HL),E INC HL LD (HL),D JR XE ; ; ; BYTE REGISTER WRITE ; XBREG: EX (SP),HL ;HvINNNNNNNNNNNNNNNNNNA9NNNNNNNNNNNNNNNNNNNNNNALL ; ; ELSE IF LAST CHAR == DELIMITER THEN REPEAT FOR ANOTHER REGISTER ; JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN IGNORE -yBNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXF FUNCTION READS 1 ARGUMENT. ; ENTRY- A= ARGUMENT 1ST CHANNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN EXPR3: ; ; BUMP ARG COUNT TO 3 ; INC B ;B HAS 2 ALREADY ; ; GET ARGS ; CALL EXPR ; ; RETURN VALUES FROM STACBNNNNNNNNNNNNNNNNNNA&ZDNNNNNNNNNNNNNNNNNNNNNN***** ; ; ; EXPR: LD HL,A1_BNK LD (ARGPTR),HL ; JR EXPR0 ; ; ; ; EXPR1: LD HL,A1_BNK LD (ARGPTR),HL JR EXPR1A NNNNNNNNNNNNNNNNNNA,NNNNNNNNNNNNNNNNNNNNN!EX2: LD A,C CP A,':' JR NZ,EX2A ; ; STORE BANK # ; LD A,L LD HL,(ARGPTR) LD (HL),A ; ; RESTART WITH ACCUMULNNNNNNNNNNNNNNNNNNAWNNNNNNNNNNNNNNNNNNNNN!----- ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL ; ; ; CONTINUATION NNNNNNNNNNNNNNNNNNA LNNNNNNNNNNNNNNNNNNNNNN ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM USER ; PUSH HL ;PTR CALL EXF POP HL ;HL= DATA ; 5BNNNNNNNNNNNNNNNNNNA:NNNNNNNNNNNNNNNNNNNNNNL= DATA INC DE ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (DE),A ; ; VALUE STORE DONE, RESTORE PTR TO ATTRIBUTES/OFFSET BYTE OFANNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN; ; ELSE IF USER REQUESTS ALTERNATE REGISTER THEN REPEAT WITH ALT TABLE ; CP A,'''' ;IF NOT PRIMES THEN EXIT JR NZ,XA BNNNNNNNNNNNNNNNNNNA)NNNNNNNNNNNNNNNNNNNNNNR ; EXIT - STACK= ARGUMENT ; ;---------------------------------------------------------------------------- EXF: ; ; SET 9NNNNNNNNNNNNNNNNNNA!NNNNNNNNNNNNNNNNNNNNNNK ; POP BC POP DE JP CRLFA ;GO DO CRLF ;***************************************************************************BNNNNNNNNNNNNNNNNNNA'iuNNNNNNNNNNNNNNNNNNNNN! ; ; ; IF LAST CHAR NOT VALID THEN ERROR ; EX3: JP NZ,QPRT ;NON 0 IS ERR ; ; IF NO ARGUMENTS LEFT THEN DONE ; EXPR1A!NNNNNNNNNNNNNNNNNNA-NNNNNNNNNNNNNNNNNNNNNNATOR = 0 ; JR EXPR0 ; ; ; ELSE PUT VALUE UNDER RETURN ADDRESS ON STACK ; EX2A: EX (SP),HL PUSH HL ; ; BUMP TO NEZK NNNNNNNNNNNNNNNNNNA:NNNNNNNNNNNNNNNNNNNNN! FROM USER INPUT ; ENTRY- A= REGISTER REQUESTED CHAR ; XA: ; ; IF AT END OF TABLE THEN DONE ; INC (HL) ;DOES NOT CHANn NNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN ; PREFETCH DATA IN A ; LD A,L ; ; IF BYTE REGISTER THEN GO DO BYTE STORE ; EX (SP),HL ;HL= ATTRIBUTE PTR BIT 7,(JdNNNNNNNNNNNNNNNNNNAwNNNNNNNNNNNNNNNNNNNNN! TABLE ; XE: POP HL ; ; IF LAST CHAR == CR THEN DONE ; XF: LD A,C ;IF LAST = CR THEN RETURN CP A,CR RET Z ; ;----NNNNNNNNNNNNNNNNNNNNA_NNNNNNNNNNNNNNNNNNNNN! LD HL,PRMTB JR XMNE1 ; ; ; DISPLAY ALL REGISTER'S DATA ; XG: LD A,(HL) ;FETCH TABLE ENTRY LD C,A ; ; IF AT ENNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNUP FOR 1 ARGUMENT ; LD B,1 ; ; INIT BANK PTR ; LD HL,A1_BNK LD (ARGPTR),HL ; ; ACCUMULATOR = 0 ; LD HL,0 ; NNNNNNNNNNNNNNNNNNA"NNNNNNNNNNNNNNNNNNNNNN* ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE TKNNNNNNNNNNNNNNNNNNA(yKNNNNNNNNNNNNNNNNNNNNNNA: DEC B RET Z ; ; ARG = 0 ; EXPR0: LD HL,0 ; ; GET NEXT CHAR FROM USER ; EX0: CALL ECHO ;GET NEXT # ; ; CONV_!NNNNNNNNNNNNNNNNNNA.NNNNNNNNNNNNNNNNNNNNNNXT ARG PAGE ; LD HL,(ARGPTR) INC HL LD (ARGPTR),HL ; ; IF LAST CHAR NOT CR THEN GET NEXT ARGUMENT ; LD A,C CALL |BNNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNGE IN ROM VERSION RET Z ; ; MAKE USER REQUEST BIT 7 SAME AS TABLE'S ; JP P,XAB ;SORT OUT BIT 7 OF TABLE OR A,80H 'NNNNNNNNNNNNNNNNNNNA *NNNNNNNNNNNNNNNNNNNNNNHL) JR Z,XBREG ; ; ELSE IF WORD REGISTER THEN GO DO WORD STORE ; BIT 6,(HL) JR Z,XWREG ; ; ELSE DO INDIRECT BYTE NNNNNNNNNNNNNNNNNNAFNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------ ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; ;-----ssNNNNNNNNNNNNNNNNNNAlNNNNNNNNNNNNNNNNNNNNNND OF TABLE THEN DONE ; INC A ;IF AT END OF TABLE THEN RETURN RET Z ; ; IF BIT 7 SET THEN DISPLAY NEW LINE ; CALL M,dNNNNNNNNNNNNNNNNNNA+NNNNNNNNNNNNNNNNNNNNNN; ENTER GETTER WITH CHAR IN A ALREADY ; JR EX1 ;**********************************************************************89NNNNNNNNNNNNNNNNNNA#NNNNNNNNNNNNNNNNNNNNN!HE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPE NNNNNNNNNNNNNNNNNNA)JzNNNNNNNNNNNNNNNNNNNNNNERT CHAR TO BINARY ; EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE ; ; IF NOT NUMBER THEN EXIT LOOP ; JR C,EX2 ; ; $" NNNNNNNNNNNNNNNNNNA/NNNNNNNNNNNNNNNNNNNNNNP2C JR NC,EX3 ; ; ELSE IF COUNT NOT EXHUSTED THEN ERROR ; DJNZ EX2B ; ; ELSE RETURN ; RET ; ; ; RELATIVE JUX9NNNNNNNNNNNNNNNNNNA\NNNNNNNNNNNNNNNNNNNNNN;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; USER REQUESTED REGISTER SHOULD MATCH NOW ; XAC: ; ; erNNNNNNNNNNNNNNNNNNA iNNNNNNNNNNNNNNNNNNNNNNSTORE ; 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 PU&dNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------------- XMNE: ; ; START AT BEGINNING OF TABLE ; LD HL,AC NNNNNNNNNNNNNNNNNNA|NNNNNNNNNNNNNNNNNNNNNNCRLF ;NEW LINE IF BIT 7 SET ; ; DISPLAY REGISTER ; LD C,(HL) PUSH HL CALL CONOUT CALL DASH ; ; DISPLAY REGISTE>NNNNNNNNNNNNNNNNNNAxNNNNNNNNNNNNNNNNNNNNNN****** ; ; EXPR3 ROUTINE GETS 3 ARGUMENTS FROM USER, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ENTRY- B= 2NNNNNNNNNNNNNNNNNNA$<&NNNNNNNNNNNNNNNNNNNNNND IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B=-jNNNNNNNNNNNNNNNNNNA*)NNNNNNNNNNNNNNNNNNNNNN ELSE ADD TO ARGUMENT ; ADD HL,HL ;ARG *= 16 ADD HL,HL ADD HL,HL ADD HL,HL OR A,L ;ADD IN NEW DIGIT LD L,A ; ;%NNNNNNNNNNNNNNNNNNA0NNNNNNNNNNNNNNNNNNNNNNMP EXTENSION ; EX2B: JP QPRT ;**************************************************************************** ; ; OUTPUT 3mrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNсo> ܅zI牶T#Ža0Βl; ٖwF嚵S"^-ˣi8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBiNNNNNNNNNNNNNNNNNNNNNN SPACES EACH COLUMN TO POSITION ON COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1 {0..15} ; EXIT - A, B= ? ; ;***********XNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNN! SAVE REG ; PUSH DE ; ; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALL LADRB ;OUTPUT ADDR ; ; DISPLAY DATA NNNNNNNNNNNNNNNNNNB ,NNNNNNNNNNNNNNNNNNNNNNEPEAT ; POP BC DJNZ BITS1 ; ; DONE ; RET ;********************************************************************* NNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNNA JR NC,PV1 ;IF SINGLE REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF BIT 6 == 0 THEN DIRECT ADDRESS ; RLCA ֵ NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN********************************************************************* ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOCNNNNNNNNNNNNNNNNNNBINNNNNNNNNNNNNNNNNNNNNN-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR ; DE= LAST LOCATION ; EXIT - HL = HL + PANNNNNNNNNNNNNNNNNNB%NNNNNNNNNNNNNNNNNNNNNNCOMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT BNNNNNNNNNNNNNNNNNNB+NNNNNNNNNNNNNNNNNNNNNN = HL + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++`9NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNBANNNNNNNNNNNNNNNNNNNNN! ; POP DE LD E,D CALL BITS2 ; ; RESTORE & DONE ; POP DE RET ;**********************************************rNNNNNNNNNNNNNNNNNNByNNNNNNNNNNNNNNNNNNNNN!******* ; ; DISPLAY REGISTER CONTENTS PROCEDURE ; ENTRY- HL= PTR TO TABLE 'REGISTER' ; EXIT - HL= PTR TO LAST BYTE OF TABLE f$NNNNNNNNNNNNNNNNNNB_NNNNNNNNNNNNNNNNNNNNNN JR NC,PV1 ; ; ELSE INDIRECT ADDRESS, (HL) ; PUSH HL ;BUILD ADDR IN HL ; LD A,(DE) ;USE CONTENTS OF HL AS ADDRESS OF\NNNNNNNNNNNNNNNNNNBPNNNNNNNNNNNNNNNNNNNNNNS THE CHAR BACK ; TO THE CONSOLE DEVICE. ; EXIT - A= CHAR ; ;***************************************************************NNNNNNNNNNNNNNNNNNB \NNNNNNNNNNNNNNNNNNNNNN1 ; CF = HL == 0 OR HL > DE ; A = ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILO:iNNNNNNNNNNNNNNNNNNB&NNNNNNNNNNNNNNNNNNNNNN- HL = HL + 1 ; BC = BC + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNB,cNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DONE IF CF ; ; NOT DONE, CHECK FOR CONSOLE A /NNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNMIT TO 0..15 LD B,A ;MULTIPLY BY 3 (X= X * 2 + X) ADD A,A ; COLUMN ADD A,B ; TRPL2: LD B,A INC B ;CONVERT N-1 TO N`NNNNNNNNNNNNNNNNNNB pNNNNNNNNNNNNNNNNNNNNNN****************************** ; ; BITS2 PROCEDURE DISPLAYS DATA AS BINARY BITS ; ENTRY- E= BINARY DATA ; EXIT - B= ? ; ;*2NNNNNNNNNNNNNNNNNNNBJNNNNNNNNNNNNNNNNNNNNNNRECORD ; DE= PTR TO LOW BYTE OF VALUE -1 ; A, BC= ? ; ;*******************************************************************'BNNNNNNNNNNNNNNNNNNBnNNNNNNNNNNNNNNNNNNNNNN VALUE LD H,A ; DEC DE LD A,(DE) LD L,A ; LD DE,(BNKLOC) ;FETCH (HL) VALUE CALL GETMEM EX DE,HL ;DE= PTR ; P*NNNNNNNNNNNNNNNNNNBaNNNNNNNNNNNNNNNNNNNNN!************* ; ; 1ST ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT A '-' ; ; GET CHAR FROM USER ; ECHO: oNNNNNNNNNNNNNNNNNNB!o?NNNNNNNNNNNNNNNNNNNNNN ; ; BUMP HL ; INC HL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0 THEN RETURN CF OR A,L SCF RET Z ; "NNNNNNNNNNNNNNNNNNB'řNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++ HILOXB: ; ; BUMP BC 1ST ; INC BC ; ; FALL INTO HILOX ; ;++++++++++NNNNNNNNNNNNNNNNNNNB-*RNNNNNNNNNNNNNNNNNNNNNNBORT ; CALL CONST ;IF NO CONSOLE BREAK THEN OR A,A ; RETURN RET Z ; ; IF CHAR != CONTROL-S THEN BREAK ; CALL CO%NNNNNNNNNNNNNNNNNNB,NNNNNNNNNNNNNNNNNNNNN! ; TRPL1: PUSH BC CALL BLK ;DO SPACING POP BC DJNZ TRPL1 ; ; DONE ; RET ;**********************************$9NNNNNNNNNNNNNNNNNNB #NNNNNNNNNNNNNNNNNNNNNN*************************************************************************** BITS2: ; ; BIT COUNT = 8 ; LD B,8 ;BIT COUN1NNNNNNNNNNNNNNNNNNBYNNNNNNNNNNNNNNNNNNNNNN********* PRTVAL: ; ; FETCH ADDRESS OFFSET OF REGISTER DATA ; INC HL ;SKIP REGISTER CHAR LD A,(HL) ;GET OFFSET & ATT@NNNNNNNNNNNNNNNNNNB=NNNNNNNNNNNNNNNNNNNNNNOP HL ; ; THIS IS TRICK, DECRIMENTS TO BYTE VALUE AND JUMPS AT SAME TIME ; DJNZ PV2 ;ALLWAYS JUMP ; ; ; FETCH DATA INNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNCALL CONI ; ; ECHO TO USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC ; ; D( NNNNNNNNNNNNNNNNNNB":lNNNNNNNNNNNNNNNNNNNNNN ; ELSE CP DE,HL ; LD A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ; ; RETURN RESULTS ; RET ;++++++imHNNNNNNNNNNNNNNNNNNB(էNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISA}NNNNNNNNNNNNNNNNNNNNB.NNNNNNNNNNNNNNNNNNNNNNNI ;IF CHAR <> CTRL-S THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ; CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; ,NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN****************************************** ; ; BITS PROCEDURE DISPLAYS ADDRESS AND DATA AS BINARY BITS ; ENTRY- HL= ADDRESS }NNNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNNT ; ; TOP OF OUTPUT LOOP ; BITS1: PUSH BC ; LD A,E ;USE MS BIT RLCA LD E,A ; ; CONVERT TO ASCII ; LD A,'0' !NNNNNNNNNNNNNNNNNNBjNNNNNNNNNNNNNNNNNNNNNNRIBUTES ; AND A,3FH ;ISOLATE OFFSET LD DE,RLOC ADD A,E ;BUILD ADDR OF REG CONTENTS LD E,A LD A,0 ADC A,D LD D,AO&NNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN ; PV1: LD A,(DE) ;GET REG CONTENTS ; ; DISPLAY DATA ; PV2: CALL HEX1 ;OUTPUT VALUE ; ; NOW DO LOW BYTE IF NEEDED NNNNNNNNNNNNNNNNNNB/NNNNNNNNNNNNNNNNNNNNNNONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HNNNNNNNNNNNNNNNNNNB# ]NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB ROUTINE BUMPS BC & HL. IT THEN CHECKS FOR (& NNNNNNNNNNNNNNNNNNB)NNNNNNNNNNNNNNNNNNNNN!LLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPA{rNNNNNNNNNNNNNNNNNNB/L0NNNNNNNNNNNNNNNNNNNNNN RETURN CONTINUE ; OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NIBNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNN; A= BINARY DATA ; EXIT - A= ? ; ;**************************************************************************** BITS ; ; DNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN/ 2 ;BUILD ASCII 1 OR 0 RLA ; ; DISPLAY ASCII DATA ; LD C,A PUSH DE CALL CONOUT POP DE ; ; IF NOT DONE THEN R NNNNNNNNNNNNNNNNNNB?NNNNNNNNNNNNNNNNNNNNNN ; ; IF BIT 7 == 0 THEN SINGLE REGISTER (BYTE) VALUE ; LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;ASSUME BYTE VALUE RLC=NNNNNNNNNNNNNNNNNNB2NNNNNNNNNNNNNNNNNNNNN!; DEC DE ;MEM PTR ; ; IF --BYTE_COUNT > 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV1 ; ; ELSE DONE ; RET ;*******гNNNNNNNNNNNNNNNNNNBzNNNNNNNNNNNNNNNNNNNNNNL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAPINNNNNNNNNNNNNNNNNNB$NNNNNNNNNNNNNNNNNNNNNN DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS I~NNNNNNNNNNNNNNNNNNB*NNNNNNNNNNNNNNNNNNNNNNRED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HLNNNNNNNNNNNNNNNNNNB0_}NNNNNNNNNNNNNNNNNNNNNNBLE FUNCTION CONVERTS THE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN RANGE, THE CARNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅuD≱O퍼\+ʒh7ՖsBᚱOힼZ)ǣf5NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB^NNNNNNNNNNNNNNNNNNNNNNRY BIT IS ; SET TO FLAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VALUE OF 'CHAR' ; ;+++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNNBONNNNNNNNNNNNNNNNNNNNNNT IS A SPECIAL CHARACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARACTER IS A CR, THE CARRY FLAG IS SET. A BLANK OR dNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTSKNNNNNNNNNNNNNNNNNNB;NNNNNNNNNNNNNNNNNNNNNNRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL STACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; SET) NNNNNNNNNNNNNNNNNNB3NNNNNNNNNNNNNNNNNNNNNN; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ; ; CLEAR BREAKPOINTS ; RS6: LD HL,TL@HNNNNNNNNNNNNNNNNNNB~NNNNNNNNNNNNNNNNNNNNNN LD (LPLOC),HL LD (EPLOC),DE LD (CPLOC),BC PUSH AF POP HL LD (FPLOC),HL LD (XLOC),IX LD (YLOC),IY ; ; GOTO MON<!NNNNNNNNNNNNNNNNNNB%NNNNNNNNNNNNNNNNNNNNNNERR ;---------------------------------------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER NNNNNNNNNNNNNNNNNNB+NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++ CONI: ; ; GET CHAR FROM CONSOLE ; CALL CI ; ; MASK OUT BIT 7 ; AND A,7FH ; ; TNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ NIBBLE: ; ; IF CHAR < 0 THEN RETURN ERROR ; SUB A,'0' RET C ; ; %NNNNNNNNNNNNNNNNNNBqNNNNNNNNNNNNNNNNNNNNN!A ; COMMA RESETS THE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' OR ',') ; CF, ZF= CR ; NC. NZ= ANY OTHER ; :NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNN ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSEdHNNNNNNNNNNNNNNNNNNBoNNNNNNNNNNNNNNNNNNNNNN UP TO RESTORE BREAKPOINT(S) ; LD HL,TLOC ;SET TABLE PTR LD D,NBKPTS ; RS2: LD A,C SUB A,(HL) ;SEE IF SOFTWARE TRAP NNNNNNNNNNNNNNNNNNB`NNNNNNNNNNNNNNNNNNNNN!OC LD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;FETCH BREAKPOINT ADDRESS LD (HL),0 ;CLEAR BREAKPOINT VdNNNNNNNNNNNNNNNNNNB k>NNNNNNNNNNNNNNNNNNNNNNITOR ; JP WINIT ;RETURN TO MONITOR ;---------------------------------------------------------------------------- ; ; 7 NNNNNNNNNNNNNNNNNNB&NNNNNNNNNNNNNNNNNNNNN! ; ;---------------------------------------------------------------------------- RSTER: PUSH AF PUSH HL LD HL,RSTMSG CA`NNNNNNNNNNNNNNNNNNB,.SNNNNNNNNNNNNNNNNNNNNNNHIS RETURN DOES DOUBLE DUTY AS A STUB ; RTS: RET ;***********************************************************************BNNNNNNNNNNNNNNNNNNB8NNNNNNNNNNNNNNNNNNNNN! IF CHAR > F THEN RETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHAR <= 9 THEN RETURN OK ; CP A,'9' - '0' + 1 .$NNNNNNNNNNNNNNNNNNB @NNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PCHK: ; ; GET CHAR FROM USER ; CALL ECHO NNNNNNNNNNNNNNNNNNNB}NNNNNNNNNNNNNNNNNNNNNNRT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;**************************************************************************NNNNNNNNNNNNNNNNNNNB^NNNNNNNNNNNNNNNNNNNNNN INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INC HL LD A,(THIS_BNK) SBC A,(HL) JR Z,RS5 ;FOUND 1, RESET IT WNNNNNNNNNNNNNNNNNNBQNNNNNNNNNNNNNNNNNNNNNNINC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO DATA ; ; IF BREAKPOINT ALREADY CLEAREDwNNNNNNNNNNNNNNNNNNB!XNNNNNNNNNNNNNNNNNNNNNN3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR lNNNNNNNNNNNNNNNNNNNB'NNNNNNNNNNNNNNNNNNNNNNLL PRTWD POP HL POP AF JP REST ;---------------------------------------------------------------------------- ; ; COd,BNNNNNNNNNNNNNNNNNNB-bNNNNNNNNNNNNNNNNNNNNNN***** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST C# NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNN!CCF RET NC ; ; ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1 CP 10 ; ; ELSE RETURN CHAR - 7 ; RET oNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN P2C: ; ; IF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = ' ' THEN RETURN RET Z ; ; IF CHAR == COMMA THE INNNNNNNNNNNNNNNNNNBnNNNNNNNNNNNNNNNNNNNNN!** REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD A,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOCNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANK INC HL ;SKIP DATA ; DEC D JR NZ,RS2 ; ; NO BREAKPOINTSMNNNNNNNNNNNNNNNNNNB+NNNNNNNNNNNNNNNNNNNNNN THEN 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 BNNNNNNNNNNNNNNNNNNB" \NNNNNNNNNNNNNNNNNNNNNNROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF TH(NNNNNNNNNNNNNNNNNNB(NNNNNNNNNNNNNNNNNNNNNNMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;---------------------------------------------------------------------------- gNNNNNNNNNNNNNNNNNNNB.H1NNNNNNNNNNNNNNNNNNNNNNHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; BNNNNNNNNNNNNNNNNNNB-NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PCHK FUNCTION READS A CHARACTER FROM THE({NNNNNNNNNNNNNNNNNNNB "NNNNNNNNNNNNNNNNNNNNNNN RETURN NC, ZF ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CF, ZF ; CP A,CR SCF RET Z ; ; ELSE RETURBNNNNNNNNNNNNNNNNNNB]NNNNNNNNNNNNNNNNNNNNNN),HL POP HL LD (FLOC),HL ; LD L,A ;REFRESH REGISTER LD A,I LD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ;NNNNNNNNNNNNNNNNNNBmNNNNNNNNNNNNNNNNNNNNNNE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-----------------------------B#dNNNNNNNNNNNNNNNNNNB)ѦNNNNNNNNNNNNNNNNNNNNN!COMERR: CALL PRTWD JP WSVEC ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONI ROUTrsNNNNNNNNNNNNNNNNNNB/{NNNNNNNNNNNNNNNNNNNNNN; 1ST ENTRY STARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STARTS WHEREVER THE CURSOR IS ; PRTWA: ; ; SAVEINNNNNNNNNNNNNNNNNNB~NNNNNNNNNNNNNNNNNNNNN! CONSOLE, THEN CHECKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARACTER, A NON-ZERO CONDITION ; IS RETURNED. IF IxNNNNNNNNNNNNNNNNNNB (NNNNNNNNNNNNNNNNNNNNN!N NC,NZ ; CCF ;ELSE RETURN NC RET ;**************************************************************************** ; NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP AT BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDˁ NNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNLD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT ; ; STORE PC ; POP DE LD (PLOC),DE LD A,(THIS_BNK) LD (BNKLOC),A NNNNNNNNNNNNNNNNNNNBMNNNNNNNNNNNNNNNNNNNNNNMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP DJNZ RS7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX INNNNNNNNNNNNNNNNNNB$NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMrNNNNNNNNNNNNNNNNNNB*NNNNNNNNNNNNNNNNNNNNN!INE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT - A= CHAR AND 7FH ; ;++++++++++++++++++++++++++++++++++++++++++++++ yNNNNNNNNNNNNNNNNNNB0hMNNNNNNNNNNNNNNNNNNNNNN REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJNNNNNNNNNсo> ܅{J艷U$Ž`0Βm< ۖyH皷U$Ÿ`/ͣk: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCmNNNNNNNNNNNNNNNNNNNNNNO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC RET ;++++++++NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN******************************************************************** CRLF: ; ; SAVE REG ; PUSH HL ; ; DISPLAY CRLF MBNNNNNNNNNNNNNNNNNNC ZNNNNNNNNNNNNNNNNNNNNNN HIGH BYTE 1ST ; LD A,H CALL HEX1 ; ; NOW DO LOW BYTE ; LD A,L ; ; FALL INTO BYTE OUTPUT PROCEDURE ; ;****NNNNNNNNNNNNNNNNNNCz|NNNNNNNNNNNNNNNNNNNNNNASCII NUMBER ; ;**************************************************************************** CONV: AND A,0FH ADD A,90H ;PU9 NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN ; ; THIS ENTRY DISPLAYS ONLY THE DASH ; DASH: LD C,'-' JR CO ;******************************************************NNNNNNNNNNNNNNNNNNC?NNNNNNNNNNNNNNNNNNNNN!YTE HANDLERS ;**************************************************************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTNNNNNNNNNNNNNNNNNNC%ONNNNNNNNNNNNNNNNNNNNNNE 0 CP A,2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 ;************************************rNNNNNNNNNNNNNNNNNNC+@NNNNNNNNNNNNNNNNNNNNN!*************** LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PRINTER 0 CP A,80H JP M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 NNNNNNNNNNNNNNNNNNNNCJ>NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF FUNCTION READS 2 ARGUMENTS FROM THE SYSTEM CONSO~NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNESSAGE ; CRLFA: LD HL,CRMSG CALL PRTWA ; ; RESTORE REG & RETURN ; POP HL RET ;********************************ܜNNNNNNNNNNNNNNNNNNCSNNNNNNNNNNNNNNNNNNNNNN************************************************************************ ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; EDz9NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN!T INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;*******************************NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN*********************** ; ; PRINT ADDR PROCEDURE DISPLAYS A WORD VALUE FOLLOWED BY A SPACE. ; ENTRY- E:HL= WORD VALUE TO DISPHNNNNNNNNNNNNNNNNNNC *NNNNNNNNNNNNNNNNNNNNNNRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;*****************************************************"!NNNNNNNNNNNNNNNNNNC&NNNNNNNNNNNNNNNNNNNNNN**************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3:NNNNNNNNNNNNNNNNNNC,oNNNNNNNNNNNNNNNNNNNNNN JP CO ;CONSOLE ;**************************************************************************** ; ; LIST DEVICE STATUS INdNNNNNNNNNNNNNNNNNNCyNNNNNNNNNNNNNNNNNNNNNNLE AND RETURNS ; WITH THE CONSOLE CURSOR ON THE NEXT LINE. ; ENTRY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; A, BC= ? ; ;+++ NNNNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNNNNNNN******************************************** ; ; LADR ROUTINE OUTPUTS THE ADDRESS VALUE ON THE CONSOLE, EITHER AT ; THE START;!NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNB',BPLOC - RLOC DB 'C',CPLOC - RLOC DB 'D',DPLOC - RLOC DB 'E',EPLOC - RLOC DB 'F',FPLOC - RLOC DB 'H',HPLOC - RLOC .9NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN*************************************************************************** PUNO: LD A,(IOBYTE) AND A,30H JP Z,SO0 ;SERIALQHNNNNNNNNNNNNNNNNNNNC ǖNNNNNNNNNNNNNNNNNNNNNNOT READY THEN RETURN 0 AND A,1 SHL NT_READY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;******************************O" NNNNNNNNNNNNNNNNNNC+.NNNNNNNNNNNNNNNNNNNNNN****************************************** CO3: EQU CO0 ;IOER CSTS3: EQU CSTS0 ;IOER CI3: EQU CI0 ;IOER ;***************rNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN************************************* ; ; LIST DEVICE 1 (LST1) ; ;**********************************************************NNNNNNNNNNNNNNNNNNCnCNNNNNNNNNNNNNNNNNNNNNN****************************************************** SI1: EQU IOER SO1 EQU IOER ;**************************************NNNNNNNNNNNNNNNNNNC#HNNNNNNNNNNNNNNNNNNNNNN############################################################## ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIV8INNNNNNNNNNNNNNNNNNC)NNNNNNNNNNNNNNNNNNNNN!E ;X EXAMINE & CHANGE REGISTERS DW QPRT ;Y DW QPRT ;Z ;------------------------------------------------------------NNNNNNNNNNNNNNNNNNC/ NNNNNNNNNNNNNNNNNNNNN!DB 'L',LPLOC - RLOC DB 'M' + 80H,[HPLOC - RLOC] + 0C0H DB 'X',[XLOC - RLOC + 1 ] + 80H DB 'Y',[YLOC - RLOC + 1 ] + 80H DrNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN! CHANNEL 0 CP A,20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIrNNNNNNNNNNNNNNNNNNC ^NNNNNNNNNNNNNNNNNNNNNN********************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;**************************************&rNNNNNNNNNNNNNNNNNNC~}NNNNNNNNNNNNNNNNNNNNNN************************************************************* ; ; LIST DEVICE 1 (LST1) ; ;*********************************1NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN****************** LO1: EQU IOER LSTAT1: EQU IOER ;**********************************************************************P/NNNNNNNNNNNNNNNNNNC;NNNNNNNNNNNNNNNNNNNNNN************************************** ; ; SERIAL CHANNEL 2 (SC1) ; ;*******************************************************!NNNNNNNNNNNNNNNNNNC$NNNNNNNNNNNNNNNNNNNNNN!E USES IT TO LOOK UP THE DESIRED ADDR. ; ;############################################################################ TBL: DdNNNNNNNNNNNNNNNNNNC*ANNNNNNNNNNNNNNNNNNNNNN---------------- ; ; Z80 REGISTER OFFSET TABLE ; ;-------------------------------------------------------------------------- NNNNNNNNNNNNNNNNNNC0NNNNNNNNNNNNNNNNNNNNNNB 'R',RLOC - RLOC ; ; BANK REGISTER ; DB 80H + 'K',BNKLOC - RLOC DB -1 END oNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNсo> ܅xG剴R [*Ȓd3Җp> ښyH枴P[)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDN@NNNNNNNNNNNNNNNNNNNNNN ZMON V2.00 DOCUMENTATION MONITOR FUNCTION CALLS: These functions are executed by placing the arguments into the prNO NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN3 C= BANK # SELECT MEMORY BANKS FOR MOVE ENTRY- A= 4 B= SOURCE BANK # C= DESTINATION BANK # BANK BLOCK MOVE E[bBNNNNNNNNNNNNNNNNNND -NNNNNNNNNNNNNNNNNNNNNNPUT DEVICE D1= 1: OUTPUT DEVICE D2= 1: SELECTABLE BAUD RATE D3= 1: XON PROTOCOL OK D4= 1: XON/XOFF ENABLED rNNNNNNNNNNNNNNNNNND+QNNNNNNNNNNNNNNNNNNNNNNTE INDEX {0: NONE, 1..15} EXIT - A= 0..15: PREVIOUS BAUD RATE INDEX FFH: ILLEGAL BAUD RATE *** Disk I/O Driver Fun?NNNNNNNNNNNNNNNNNNDĚNNNNNNNNNNNNNNNNNNNNNN CODE *** Miscellaneous I/O Driver Functions *** RETURN MISCELLANEOUS DRIVER VERSION ENTRY- A= 9 D= 0 EXIT - HL= NNNNNNNNNNNNNNNNNNDnNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND("NNNNNNNNNNNNNNNNNNNNNNrg #2 HL= Arg #3 E:HL= Banked memory ptr Return Values: A= Byte HL= Word BC, DE= Additional values Function deSB NNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNION BYTE PTR + 1 BC= 0 EXECUTE BANK ENTRY- A= 6 E':HL'= PTR TO EXECUTION CODE *** Character I/O Device FunctioncNNNNNNNNNNNNNNNNNNDmONNNNNNNNNNNNNNNNNNNNNN EXIT - A= 0: OK, /0: ERROR CODE SET STANDARD CONSOLE DEVICE ENTRY- A= 7 D= 3 B= DEVICE # TO SET TO {0..15}, -1, -2}sNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN ENTRY- A= 8 D= 1 BC= PHYSICAL DRIVE # BITS 2..0= ROM # 3= 0 7..4= DRIVE # 15..8= CONTROLLER kBNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN WRITE CLOCK BUFFER ENTRY- A= 9 D= 2 E:HL= PTR TO 13 BYTE BUFFER TO SET CLOCK FROM RETURN CLOCK CALENDAR DATA ENTRTNNNNNNNNNNNNNNNNNND!HNNNNNNNNNNNNNNNNNNNNNN= 8 START CLOCK ENTRY- A= 9 D= 9 NNNNNNNNNNNNNNNNNND'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND- NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNscriptions: RETURN MONITOR ROM VERSION # ENTRY- A= 0 EXIT - HL= BINARY VERSION # IN HUNDREDTHS (X.XX) *** MEMORY MANAP NNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNN!s *** RETURN CHAR DEVICE VERSION # ENTRY- A= 7 D= 0 EXIT - HL= BINARY VERSION # IN HUNDREDTHS (X.XX) RETURN CHAR DEWpNNNNNNNNNNNNNNNNNND~NNNNNNNNNNNNNNNNNNNNNN EXIT - A= 0..15: PREVIOUS DEVICE -1: ILLEGAL DEVICE SET STANDARD LIST DEVICE ENTRY- A= 7 D= 4 B= DEVICE # TO)NNNNNNNNNNNNNNNNNNNNDԤNNNNNNNNNNNNNNNNNNNNNN# EXIT - ERROR, WILL NOT RETURN IF SUCCESSFUL TEST IOPB.PBSTATO FOR ERROR AND DUMP IOPB IF TRUE ENTRY- A= 8 D= 2 rNNNNNNNNNNNNNNNNNND;oNNNNNNNNNNNNNNNNNNNNNNY- A= 9 D= 3 EXIT - A= DAY B= MONTH C= YEAR L= DAY OF WEEK (0= SUNDAY, 1= MONDAY..) RETURN CLOCK TIME DATA ENrNNNNNNNNNNNNNNNNNND"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND(>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND.XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNGEMENT *** RETURN BANKED MEMORY DATA ENTRY- A= 1 E:HL= PTR TO DATA LOCATION EXIT - A= DATA FROM LOCATION STORE BANKENNNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNVICE PARAMETERS ENTRY- A= 7 D= 1 B= DEVICE # {0..15}, -1, -2} E:HL= PTR TO LOCATION TO PLACE DATA EXIT - A= 0: DEVIrNNNNNNNNNNNNNNNNNNDM3NNNNNNNNNNNNNNNNNNNNNN SET TO {0..15}, -1, -2} EXIT - A= 0..15: PREVIOUS DEVICE -1: ILLEGAL DEVICE INITIALIZE CHAR DEVICE ENTRY- A= 7 rNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!E:HL= IOPB PTR EXIT - AF= 0: NO ERROR, /0: ERROR CODE DISPLAY IOPB ERROR DATA ENTRY- A= 8 D= 3 E:HL= IOPB PTR EXI*NNNNNNNNNNNNNNNNNND^NNNNNNNNNNNNNNNNNNNNNNTRY- A= 9 D= 4 EXIT - A= SECONDS B= MINUTES C= HOURS RETURN CLOCK REGISTER DATA ENTRY- A= 9 D= 5 L= REGISTNNNNNNNNNNNNNNNNNND#.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND/kNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNND MEMORY DATA ENTRY- A= 2 E:HL= DATA PTR C= DATA TO STORE INTO LOCATION SELECT MEMORY BANK FOR EXECUTION ENTRY- A= G:NNNNNNNNNNNNNNNNNND 8NNNNNNNNNNNNNNNNNNNNNNCE NOT PRESENT /0: BUFFER CONTENTS (BY OFFSET) (0)= 6 CHAR ASCII LOGICAL DEVICE NAME (6)= MODE BITS: D0= 1: INp%NNNNNNNNNNNNNNNNNND`NNNNNNNNNNNNNNNNNNNNNND= 5 B= DEVICE # {0..15}, -1, -2} SET DEVICE BAUD RATE ENTRY- A= 7 D= 6 B= DEVICE # {0..15}, -1, -2} C= BAUD RA NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNT - AF= 0: NO ERROR, /0: ERROR CODE EXECUTE IOPB ENTRY- A= 8 D= 4 E:HL= IOPB PTR EXIT - AF= 0: NO ERRORS, /0: ERROR9NNNNNNNNNNNNNNNNNND] NNNNNNNNNNNNNNNNNNNNN!ER # EXIT - A= DATA FROM CLOCK REGISTER WAIT FOR CLOCK TO CHANGE. DOES NOT RETURN UNTIL CLOCK SECONDS CHANGE. NOTE: INSURHNNNNNNNNNNNNNNNNNND$SNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND*\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNND0xNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNŃj9ׅvE㉲P[+ɒg6ӖrA~M랺X'ţc2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDypNNNNNNNNNNNNNNNNNNNNNN SUBTTL MONITOR ROM EXTERNAL DEFINITIONS ;**************************************************************************** ; ; INNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN FUNCTIONS ; ;============================================================================ STRUCT 0F800H ;START OF ROM MR_MrNNNNNNNNNNNNNNNNNND <NNNNNNNNNNNNNNNNNNNNNNDM ;============================================================================ ; ; ROM SWAP CROSS-OVER POINT ; ;=======NNNNNNNNNNNNNNNNNNDaNNNNNNNNNNNNNNNNNNNNN!****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brGINNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@NNNNNNNNNNNNNNNNNNDY NNNNNNNNNNNNNNNNNNNNNN**** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF JBNNNNNNNNNNNNNNNNNND%RNNNNNNNNNNNNNNNNNNNNNN============ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFANNNNNNNNNNNNNNNNNND+]NNNNNNNNNNNNNNNNNNNNNN INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIjNNNNNNNNNNNNNNNNNNND,#NNNNNNNNNNNNNNNNNNNNNNNCLUDE FILE THAT DEFINES THE MONITOR ROM I/O ; ;**************************************************************************** $NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!CBOOT DS 3 ;COLD START ENTRY MR_CONIN DS 3 ;CONSOLE INPUT ; EXIT - A= CHAR DS 3 ;UNSUPPORTED TAPE READER MR_CONOUT DS 3c\rNNNNNNNNNNNNNNNNNNDiNNNNNNNNNNNNNNNNNNNNNNN===================================================================== MR_XOVER EQU 0F800H + 33H ;ADDRESS OF THE SWAPPING 'OUT' Ί NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!eakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#NNNNNNNNNNNNNNNNNND LNNNNNNNNNNNNNNNNNNNNNN ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INC!NNNNNNNNNNNNNNNNNND&NNNNNNNNNNNNNNNNNNNNN!ULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATGINNNNNNNNNNNNNNNNNND, NNNNNNNNNNNNNNNNNNNNN!ST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCKBNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN; ; REVISION HISTORY: ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change symbols to 'MR_' prefixes of 8 siJNNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNN! ;CONSOLE OUTPUT ; ENTRY- C= CHAR DS 3 ;UNSUPPORTED TAPE PUNCH MR_LSTOUT DS 3 ;LIST DEVICE OUTPUT ; EXTRY- C= CHAR TNNNNNNNNNNNNNNNNNNDZNNNNNNNNNNNNNNNNNNNNNNINSTRUCTION P^ NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!is ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelHNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4BNNNNNNNNNNNNNNNNNND!NNNNNNNNNNNNNNNNNNNNNNLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST ODNNNNNNNNNNNNNNNNNND'0NNNNNNNNNNNNNNNNNNNNNNION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQMNNNNNNNNNNNNNNNNNNND-:NNNNNNNNNNNNNNNNNNNNNN ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY{NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNgnificant chars. ; ;**************************************************************************** ;=======================^NNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNN MR_CONSTS DS 3 ;RETURN CONSOLE INPUT STATUS ; EXIT - A= 0: NOT READY, /0: CHAR READY DS 3 ;UNSUPPORTED IOCHK DS 3 ;UNSr NNNNNNNNNNNNNNNNNNDI2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,INNNNNNNNNNNNNNNNNND _NNNNNNNNNNNNNNNNNNNNNNot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi`NNNNNNNNNNNNNNNNNNND"*NNNNNNNNNNNNNNNNNNNNNNN ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START A NNNNNNNNNNNNNNNNNND(NNNNNNNNNNNNNNNNNNNNNNU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOCBNNNNNNNNNNNNNNNNNND.oNNNNNNNNNNNNNNNNNNNNN! LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; NNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN===================================================== ; ; ROM # ; ;========================================================3!NNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNN!UPPORTED IOSET DS 3 ;UNSUPPORTED MEMCK DS 3 ;UNSUPPORTED IODEF DS 3 ;UNSUPPORTED I/O CONTROL MR_REST DS 3 ;BREAKPOINT ENT;NNNNNNNNNNNNNNNNNNDzNNNNNNNNNNNNNNNNNNNNNN TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMNNNNNNNNNNNNNNNNNNDХNNNNNNNNNNNNNNNNNNNNNNning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to urNNNNNNNNNNNNNNNNNND?nNNNNNNNNNNNNNNNNNNNNN!nitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.X 3 JUN 86 dNNNNNNNNNNNNNNNNNND#NNNNNNNNNNNNNNNNNNNNN!DDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; =NNNNNNNNNNNNNNNNNND)?NNNNNNNNNNNNNNNNNNNNNN EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM*gNNNNNNNNNNNNNNNNNND/\NNNNNNNNNNNNNNNNNNNNNN; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;----------------------------------------ޅ NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN==================== MR_RNUM EQU 0 ;============================================================================ ; ; ROMJ!NNNNNNNNNNNNNNNNNND ,NNNNNNNNNNNNNNNNNNNNNNRY MR_LSTSTS DS 3 ;RETURN LIST DEVICE STATUS ; EXIT - A= 0: NOT READY, /0: READY FOR CHAR DS 3 ;SPARE DS 3 ;SPARE ENbvINNNNNNNNNNNNNNNNNND/PNNNNNNNNNNNNNNNNNNNNNN MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************edNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhrNNNNNNNNNNNNNNNNNNDj=NNNNNNNNNNNNNNNNNNNNNN GRH ; MODIFY TO WORK WITH M5INIT ; VERSN EQU '1x' ;************************************************************************[BNNNNNNNNNNNNNNNNNND$cNNNNNNNNNNNNNNNNNNNNN! CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;================O NNNNNNNNNNNNNNNNNND*lNNNNNNNNNNNNNNNNNNNNNN ;-------------------------------------- ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP NNNNNNNNNNNNNNNNNND0ONNNNNNNNNNNNNNNNNNNNNN-------- DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;---------NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNсo> ܅{J艷U$Ž`0Βl; ږxG嚵S"^-ˣi8nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE8NNNNNNNNNNNNNNNNNNNNNN----------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSUNNNNNNNNNNNNNNNNNNERNNNNNNNNNNNNNNNNNNNNNNMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 ME(NNNNNNNNNNNNNNNNNNE }NNNNNNNNNNNNNNNNNNNNNNHL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZNNNNNNNNNNNNNNNNNNE]NNNNNNNNNNNNNNNNNNNNNNM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;******************************wo NNNNNNNNNNNNNNNNNNE.NNNNNNNNNNNNNNNNNNNNNN,BC POP BC ;UNPREDICTABLE DURING INIT RET ;***************************************************************************NNNNNNNNNNNNNNNNNNNNNNEND THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGgIBNNNNNNNNNNNNNNNNNNE'NNNNNNNNNNNNNNNNNNNNNNTURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D T!NNNNNNNNNNNNNNNNNNE-{NNNNNNNNNNNNNNNNNNNNNN,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------------------------------- ASGN: CALL ECHO ;GET \2 NNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOdNNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNN! CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXINNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNND),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSڵNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN VALUE LD H,A ; DEC DE LD A,(DE) LD L,A ; LD DE,(BNKLOC) ;FETCH (HL) VALUE CALL GETMEM EX DE,HL ;DE= PTR ; P*NNNNNNNNNNNNNNNNNNEMNNNNNNNNNNNNNNNNNNNNNNCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP0!NNNNNNNNNNNNNNNNNNE"kANNNNNNNNNNNNNNNNNNNNN!IT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARNNNNNNNNNNNNNNNNNNE(NNNNNNNNNNNNNNNNNNNNNNHEN ERR RET ;ELSE RETURN ;---------------------------------------------------------------------------- ; ; LOGICAL ASSI!NNNNNNNNNNNNNNNNNNE..,NNNNNNNNNNNNNNNNNNNNNNTHE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRI,ZNNNNNNNNNNNNNNNNNNE0NNNNNNNNNNNNNNNNNNNNN!VE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOHNNNNNNNNNNNNNNNNNNNE ?NNNNNNNNNNNNNNNNNNNNN!T ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' dNNNNNNNNNNNNNNNNNNE;NNNNNNNNNNNNNNNNNNNNN!G ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETg"BNNNNNNNNNNNNNNNNNNE!NNNNNNNNNNNNNNNNNNNNNN LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONINNNNNNNNNNNNNNNNNNE~NNNNNNNNNNNNNNNNNNNNNN HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT 5CNNNNNNNNNNNNNNNNNNE#XpNNNNNNNNNNNNNNNNNNNNNNAMETERS ; ;**************************************************************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN COpdNNNNNNNNNNNNNNNNNNE)NNNNNNNNNNNNNNNNNNNNNNGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPEzrNNNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNNES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD NNNNNNNNNNNNNNNNNNEcNNNNNNNNNNNNNNNNNNNNNNBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MENNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNNFOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC rNNNNNNNNNNNNNNNNNNEnNNNNNNNNNNNNNNNNNNNNNNURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT RO~NNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNTOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL\ABNNNNNNNNNNNNNNNNNNE+NNNNNNNNNNNNNNNNNNNNNN- STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALRgNNNNNNNNNNNNNNNNNNE$NNNNNNNNNNNNNNNNNNNNNNDE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO 9NNNNNNNNNNNNNNNNNNE*NNNNNNNNNNNNNNNNNNNNNNS. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES,ŚNNNNNNNNNNNNNNNNNNE0PNNNNNNNNNNNNNNNNNNNNNNHL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WARM START CODE ; ;------------------------VNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃj9ׅvE㉲P\,˒j9ؖvE䚴R!𞿟],ʣh7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN---- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL BNNNNNNNNNNNNNNNNNNEbNNNNNNNNNNNNNNNNNNNNNNSTART_ADDR> ; ;---------------------------------------------------------------------------- FILL: CAOCNNNNNNNNNNNNNNNNNNE JNNNNNNNNNNNNNNNNNNNNNN BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= Ne$INNNNNNNNNNNNNNNNNNEjNNNNNNNNNNNNNNNNNNNNN! ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;------------------------------------------------------------------------ INNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN-------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HLNNNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNN ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CA aNNNNNNNNNNNNNNNNNNE%NNNNNNNNNNNNNNNNNNNNNN NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE9NNNNNNNNNNNNNNNNNNE+NNNNNNNNNNNNNNNNNNNNNNN AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITHaNNNNNNNNNNNNNNNNNNNEZNNNNNNNNNNNNNNNNNNNNNN LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Zyg NNNNNNNNNNNNNNNNNNE\NNNNNNNNNNNNNNNNNNNNNNLL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTONNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;*****:BNNNNNNNNNNNNNNNNNNEBNNNNNNNNNNNNNNNNNNNNNN---- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE 9NNNNNNNNNNNNNNNNNNEMNNNNNNNNNNNNNNNNNNNNNN) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALNNNNNNNNNNNNNNNNNNE :NNNNNNNNNNNNNNNNNNNNNNLL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LyNNNNNNNNNNNNNNNNNNE&NNNNNNNNNNNNNNNNNNNNNN LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO ~NNNNNNNNNNNNNNNNNNE,~NNNNNNNNNNNNNNNNNNNNNN BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- GY?BNNNNNNNNNNNNNNNNNNEiNNNNNNNNNNNNNNNNNNNNN!' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ; NNNNNNNNNNNNNNNNNNE mNNNNNNNNNNNNNNNNNNNNNNRE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;----------------?NNNNNNNNNNNNNNNNNNNE,NNNNNNNNNNNNNNNNNNNNNN************************************** ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;*******************NNNNNNNNNNNNNNNNNNEsNNNNNNNNNNNNNNNNNNNNNNBELL DJNZ BYE1 RET ;---------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMʏNNNNNNNNNNNNNNNNNNNNE|NNNNNNNNNNNNNNNNNNNNNNL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;------------------------------------ NNNNNNNNNNNNNNNNNNNE! "NNNNNNNNNNNNNNNNNNNNNND A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L59rNNNNNNNNNNNNNNNNNNE'NNNNNNNNNNNNNNNNNNNNNNSPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTO COMMAND $NNNNNNNNNNNNNNNNNNNE-LONNNNNNNNNNNNNNNNNNNNNNOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,P<4dNNNNNNNNNNNNNNNNNNE1NNNNNNNNNNNNNNNNNNNNNNADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;---------------------------------3 NNNNNNNNNNNNNNNNNNE >NNNNNNNNNNNNNNNNNNNNNN------------ AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 C\dNNNNNNNNNNNNNNNNNNE?NNNNNNNNNNNNNNNNNNNNNN************************ IOCHK: LD A,(IOBYTE) RET ;---------------------------------------------------------------------FNNNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DE#'NNNNNNNNNNNNNNNNNNEzNNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSO{BNNNNNNNNNNNNNNNNNNE"\qNNNNNNNNNNNNNNNNNNNNNN ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0Fg NNNNNNNNNNNNNNNNNNE(NNNNNNNNNNNNNNNNNNNNNN; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS 7BNNNNNNNNNNNNNNNNNNE.NNNNNNNNNNNNNNNNNNNNN!LOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 yNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFvAHNNNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B ~ NNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNN------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & ANNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNTECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATNNNNNNNNNNNNNNNNNNEINNNNNNNNNNNNNNNNNNNNNNLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPmdNNNNNNNNNNNNNNNNNNE#o@NNNNNNNNNNNNNNNNNNNNNNH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CPwdNNNNNNNNNNNNNNNNNNE)NNNNNNNNNNNNNNNNNNNNNNALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVERrNNNNNNNNNNNNNNNNNNE/*-NNNNNNNNNNNNNNNNNNNNNN GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL=5INNNNNNNNNNNNNNNNNNESNNNNNNNNNNNNNNNNNNNNNNINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F< [NNNNNNNNNNNNNNNNNNE yNNNNNNNNNNNNNNNNNNNNNN JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL^rNNNNNNNNNNNNNNNNNNEYNNNNNNNNNNNNNNNNNNNNNNWILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE NNNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNNIVE ADDRESS. ; ; V ; ;--------------------------------------------NNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ]rNNNNNNNNNNNNNNNNNNE$NNNNNNNNNNNNNNNNNNNNNN 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR+cNNNNNNNNNNNNNNNNNNE*NNNNNNNNNNNNNNNNNNNNNN IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTIOsrNNNNNNNNNNNNNNNNNNE09`NNNNNNNNNNNNNNNNNNNNNN EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR ENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNсo> ݅{J艷U$Îa0Βl; ږxG暶T#_.̣j9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNF(NNNNNNNNNNNNNNNNNNNNN! INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),ANNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNN!------------------ INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE $G NNNNNNNNNNNNNNNNNNF ENNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILO]NNNNNNNNNNNNNNNNNNF9NNNNNNNNNNNNNNNNNNNNNNRAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMInINNNNNNNNNNNNNNNNNNF)NNNNNNNNNNNNNNNNNNNNNNIF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOINNNNNNNNNNNNNNNNNNFTNNNNNNNNNNNNNNNNNNNNNN JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD$NNNNNNNNNNNNNNNNNNNF%i NNNNNNNNNNNNNNNNNNNNNN END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH%;NNNNNNNNNNNNNNNNNNF+JNNNNNNNNNNNNNNNNNNNNNN OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP C[NNNNNNNNNNNNNNNNNNF{NNNNNNNNNNNNNNNNNNNNN! GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF  INNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO <6NNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B NNNNNNNNNNNNNNNNNNF_NNNNNNNNNNNNNNNNNNNNNNNATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY T{!NNNNNNNNNNNNNNNNNNF|NNNNNNNNNNNNNNNNNNNNN!D 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;---------------------------------------------------------XNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNN A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;------------------------------------X#rNNNNNNNNNNNNNNNNNNF& ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTOɉNNNNNNNNNNNNNNNNNNF'NNNNNNNNNNNNNNNNNNNNNN<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------tNNNNNNNNNNNNNNNNNNFlNNNNNNNNNNNNNNNNNNNNNNO ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CALL EXPR1 `NNNNNNNNNNNNNNNNNNFONNNNNNNNNNNNNNNNNNNNNN------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NBNNNNNNNNNNNNNNNNNNF!NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LBNNNNNNNNNNNNNNNNNNF'hNNNNNNNNNNNNNNNNNNNNNNALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALNNNNNNNNNNNNNNNNNNF-NNNNNNNNNNNNNNNNNNNNNNN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY E NNNNNNNNNNNNNNNNNNF\NNNNNNNNNNNNNNNNNNNNNN4 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;----------------------------xdNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNN! E, PORT # INTO C POP DE POP BC OUT (C),E RET ;----------------------------------------------------------------------P NNNNNNNNNNNNNNNNNNFjNNNNNNNNNNNNNNNNNNNNNN------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # PJNNNNNNNNNNNNNNNNNNNF9NNNNNNNNNNNNNNNNNNNNNN;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NE8rNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;------NNNNNNNNNNNNNNNNNNF"NNNNNNNNNNNNNNNNNNNNNNAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,xYNNNNNNNNNNNNNNNNNNF(VNNNNNNNNNNNNNNNNNNNNN!L EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RL8HNNNNNNNNNNNNNNNNNNNF.NNNNNNNNNNNNNNNNNNNNNN JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RNNNNNNNNNNNNNNNNNNNFoNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------ ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR 2$NNNNNNNNNNNNNNNNNNNF LNNNNNNNNNNNNNNNNNNNNNN------ ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, S8erNNNNNNNNNNNNNNNNNNF[NNNNNNNNNNNNNNNNNNNNNNOP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAdNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR8 NNNNNNNNNNNNNNNNNNF6NNNNNNNNNNNNNNNNNNNNN!---------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LDڴ9NNNNNNNNNNNNNNNNNNF#ìNNNNNNNNNNNNNNNNNNNNNNB,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 ; ;------------------V5NNNNNNNNNNNNNNNNNNF),gNNNNNNNNNNNNNNNNNNNNNNCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR "OdNNNNNNNNNNNNNNNNNNF/NNNNNNNNNNNNNNNNNNNNNNET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD o)BNNNNNNNNNNNNNNNNNNF:NNNNNNNNNNNNNNNNNNNNNNOUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----------------------------------------------------------ArNNNNNNNNNNNNNNNNNNF tNNNNNNNNNNNNNNNNNNNNNNOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------irNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN g NNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;>erNNNNNNNNNNNNNNNNNNFeNNNNNNNNNNNNNNNNNNNNNN (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX dNNNNNNNNNNNNNNNNNNF$Z;NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT!NNNNNNNNNNNNNNNNNNF*y4NNNNNNNNNNNNNNNNNNNNNNXF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR5NNNNNNNNNNNNNNNNNNF0NNNNNNNNNNNNNNNNNNNNNNB,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNŃk: مwF䉳Q ^-˒i8זuD䚴R!𞿟],ʣh7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL rNNNNNNNNNNNNNNNNNNF>NNNNNNNNNNNNNNNNNNNNN!*************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE.9ANNNNNNNNNNNNNNNNNNF uNNNNNNNNNNNNNNNNNNNNNN INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. Ɛ NNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A INNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CO$NNNNNNNNNNNNNNNNNNFdNNNNNNNNNNNNNNNNNNNNNNTHE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMM1NNNNNNNNNNNNNNNNNNNF%^:NNNNNNNNNNNNNNNNNNNNNN TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT5BNNNNNNNNNNNNNNNNNNF+}5NNNNNNNNNNNNNNNNNNNNN!;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUjBNNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNNNNNNNNNNNDJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET J NNNNNNNNNNNNNNNNNNF.NNNNNNNNNNNNNNNNNNNNNN ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PnNNNNNNNNNNNNNNNNNNF&NNNNNNNNNNNNNNNNNNNNNN ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;******************************************5NNNNNNNNNNNNNNNNNNFhNNNNNNNNNNNNNNNNNNNNNN ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR NNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNNNNNNNNNNNNDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG NNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNN!ANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;**********************************************************DrNNNNNNNNNNNNNNNNNNF& iNNNNNNNNNNNNNNNNNNNNNN 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) 'INNNNNNNNNNNNNNNNNNF,NNNNNNNNNNNNNNNNNNNNNNSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MO9XNNNNNNNNNNNNNNNNNNNNFzNNNNNNNNNNNNNNNNNNNNN!FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;**************************************************************************** ; ; C$NNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;**********************************NNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN********************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPAR1NNNNNNNNNNNNNNNNNNF[NNNNNNNNNNNNNNNNNNNNNN;*************************************************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ;uBNNNNNNNNNNNNNNNNNNFxNNNNNNNNNNNNNNNNNNNNNN IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;************************************************************************`NNNNNNNNNNNNNNNNNNF!NNNNNNNNNNNNNNNNNNNNNN****************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION NNNNNNNNNNNNNNNNNNF'8XNNNNNNNNNNNNNNNNNNNNNN INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D }BNNNNNNNNNNNNNNNNNNF-דNNNNNNNNNNNNNNNNNNNNNNNITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AF POP BC 0NNNNNNNNNNNNNNNNNNFkNNNNNNNNNNNNNNNNNNNNNNONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXI:rNNNNNNNNNNNNNNNNNNF HNNNNNNNNNNNNNNNNNNNNNN***************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. N NNNNNNNNNNNNNNNNNNFZNNNNNNNNNNNNNNNNNNNNNNE HL TO DE SUB L LD A,D SBC A,H RET ;********************************************************** ; ; HILOX ROUTINENNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;**************TNNNNNNNNNNNNNNNNNNF7NNNNNNNNNNNNNNNNNNNNNN**** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IFD]rNNNNNNNNNNNNNNNNNNF"ǭNNNNNNNNNNNNNNNNNNNNNN EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DENNNNNNNNNNNNNNNNNNF((fNNNNNNNNNNNNNNNNNNNNN! ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATIONNNNNNNNNNNNNNNNNNNF.NNNNNNNNNNNNNNNNNNNNN! POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; {NNNNNNNNNNNNNNNNNNNNFXNNNNNNNNNNNNNNNNNNNNNNT - A= C= ASCII NUMBER ; ;*************************************************************** CONV: AND 0FH ADD A,90H ;PUT INT2NNNNNNNNNNNNNNNNNNNF {NNNNNNNNNNNNNNNNNNNNNN ; ;*************************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP 9NNNNNNNNNNNNNNNNNNFkNNNNNNNNNNNNNNNNNNNNN! INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CAL6 NNNNNNNNNNNNNNNNNNF=NNNNNNNNNNNNNNNNNNNNNN************************************************* NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCFLINNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNN! CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;****************************************************BNNNNNNNNNNNNNNNNNNF#NNNNNNNNNNNNNNNNNNNNNNC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HLs NNNNNNNNNNNNNNNNNNF)WNNNNNNNNNNNNNNNNNNNNN!N CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SY>dNNNNNNNNNNNNNNNNNNF/NNNNNNNNNNNNNNNNNNNNNN ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETEArNNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNN!O ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;************************************;NNNNNNNNNNNNNNNNNNF DNNNNNNNNNNNNNNNNNNNNNNDE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HILO ROUTINENdNNNNNNNNNNNNNNNNNNF8NNNNNNNNNNNNNNNNNNNNNNLING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RyNNNNNNNNNNNNNNNNNNF-NNNNNNNNNNNNNNNNNNNNNN RET NC SUB 'A' - '9' - 1 CP 10 RET ;**************************************************************************** rNNNNNNNNNNNNNNNNNNFUNNNNNNNNNNNNNNNNNNNNNN************************ ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. bPNNNNNNNNNNNNNNNNNNF$m NNNNNNNNNNNNNNNNNNNNNN ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWAREtBNNNNNNNNNNNNNNNNNNF*NNNNNNNNNNNNNNNNNNNNNNNSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) 1 NNNNNNNNNNNNNNNNNNF0NNNNNNNNNNNNNNNNNNNNN!CTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERRORNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNҁp?ޅ}LꉹW&Ďb1ϒm< ږxG嚵S"^-ˣi9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG՜NNNNNNNNNNNNNNNNNNNNNN CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CrBNNNNNNNNNNNNNNNNNNG:NNNNNNNNNNNNNNNNNNNNN!; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTNNNNNNNNNNNNNNNNNNG NNNNNNNNNNNNNNNNNNNNN!READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: NNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN*********************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;**** NNNNNNNNNNNNNNNNNNG_FNNNNNNNNNNNNNNNNNNNNNN****************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA $NNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLEDNNNNNNNNNNNNNNNNNNNNG%NNNNNNNNNNNNNNNNNNNNNN..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************************************,dNNNNNNNNNNNNNNNNNNG+VNNNNNNNNNNNNNNNNNNNNNNEN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1 j rNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN LSTAT0 JR Z,LO0 ; LD A,0BFH ;INSURE STROBE HIGH (LOGICAL 0) OUT (PRI2CNT),A LD A,C ;OUTPUT CHARACTER OUT (PRI1DOVNNNNNNNNNNNNNNNNNNNGxHNNNNNNNNNNNNNNNNNNNNNN IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET  NNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG:NNNNNNNNNNNNNNNNNNG"NNNNNNNNNNNNNNNNNNNNN! DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X dNNNNNNNNNNNNNNNNNNG(^NNNNNNNNNNNNNNNNNNNNNNOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;--------------------------------- ; ; Z80 REGIS#'NNNNNNNNNNNNNNNNNNNG.tNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG.hNNNNNNNNNNNNNNNNNNNNNN**************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALL CSTS0 ;NNNNNNNNNNNNNNNNNNNG gNNNNNNNNNNNNNNNNNNNNN!; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR RET Z ,Q NNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: 0rNNNNNNNNNNNNNNNNNNGKyNNNNNNNNNNNNNNNNNNNNN! ;************************************** ; ; LIST DEVICE 2 (LST2) ; ;************************************** LO2: EQU IO|NNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' qrNNNNNNNNNNNNNNNNNNG#(NNNNNNNNNNNNNNNNNNNNNN DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIS1HNNNNNNNNNNNNNNNNNNG)mNNNNNNNNNNNNNNNNNNNNNNTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB+rNNNNNNNNNNNNNNNNNNG/ENNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNG{;NNNNNNNNNNNNNNNNNNNNNNIF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CH:NNNNNNNNNNNNNNNNNNG NNNNNNNNNNNNNNNNNNNNNN; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***7BNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNIN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST RET Z ; LD A,-1 RET ;******************************QNNNNNNNNNNNNNNNNNNG[GNNNNNNNNNNNNNNNNNNNNN!ER LSTAT2: EQU IOER ;************************************** ; ; SERIAL CHANNEL 0 (SC0) ; ;****************************~dNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;*************************************************4rNNNNNNNNNNNNNNNNNNG$NNNNNNNNNNNNNNNNNNNNN!T DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB_uNNNNNNNNNNNNNNNNNNG*8NNNNNNNNNNNNNNNNNNNNN! 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',>tNNNNNNNNNNNNNNNNNNG0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNNҁq@ޅ}M뉺X(Ǝd3Ғp?ݖ{J蚷U$Ÿ`/ͣk; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHrNNNNNNNNNNNNNNNNNNNNNN; TITLE 'DISK MOSS 2.2 MONITOR' MACLIB Z80 PAGE 56 ; ; DISK MOSS MONITOR (VERSION 2.2) ; ; 14 JUNE 1980 ; ALL RIGHTS eNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNGISTER SLSTAT: EQU SDATA+5 ;SERIAL LINE STATUS REGISTER SMDMST: EQU SDATA+6 ;SERIAL MODEM STATUS REGISTER ; ; SPSV: EQU 6 ;R+NNNNNNNNNNNNNNNNNNNH DNNNNNNNNNNNNNNNNNNNNNN+2 ;DISK SECTOR PORT DDATA EQU DSTAT+3 ;DISK DATA PORT DFLAG EQU DSTAT+4 ;DISK FLAG PORT DCNTL EQU DSTAT+4 ;DISK CONTROL PORTSNNNNNNNNNNNNNNNNNNHdcNNNNNNNNNNNNNNNNNNNNNNUNCH: JMP PO ;PUNCH OUTPUT LIST: JMP LO ;LIST OUTPUT CONST: JMP CSTS ;CONSOLE STATUS JMP IOCHK ;PUT IOBYTE INTO (A) JMP IO NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN STACK TO INITIALIZE RESTARTS LXI H,JMP*256 ; WITH RESTART ERROR VECTORS LXI D,RSTER MVI B,16 ;16 TIMES (64 BYTES) INIT1pNNNNNNNNNNNNNNNNNNH!NNNNNNNNNNNNNNNNNNNNNN B POP B ;(B,C) IS UNPREDICTABLE DURING INIT RET ; ; ROUTINE MEMCHK FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY ; (LESS TH_NNNNNNNNNNNNNNNNNNH%PNNNNNNNNNNNNNNNNNNNNNNTS LXI H,LOGMSG ;LOG ONTO THE SYSTEM CALL PRTWD JR WINIT ;GO TO MONITOR EXECUTIVE ; ; ROUTINE EXF READS ONE PARAMETER. KRNNNNNNNNNNNNNNNNNNH+_NNNNNNNNNNNNNNNNNNNNNN ; AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JRNZ QPRT ;NON-ZERO IS ERROR EXPR1: DCR B ;MORE PARAMETERS? RZ ;NO, RETURNNNNNNNNNNNNNNNNNNNNHT!NNNNNNNNNNNNNNNNNNNNNNRESERVED BY ROBERT B. MASON ; MOSS: ORG 0F000H ROM: EQU 0F000H ;ROM START ADDRESS WSVEC: EQU 0 ;VECTOR FOR WARM RESTART NBKHNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNSTACK POINTER SAVE LOCATION ; ; ; REGISTER STORAGE DISPLACEMENTS FROM ; NORMAL SYSTEM STACK LOCATION. ; ALOC: EQU 15H BLO dNNNNNNNNNNNNNNNNNNHLNNNNNNNNNNNNNNNNNNNNNN ; ; DISKNO: EQU 40H ;ACTIVE DISK NUMBER TRACK: EQU DISKNO+1 SECTOR: EQU TRACK+1 SIDE: EQU SECTOR+1 ;SIDE SELECT HOLD AREBNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNSET ;(C) HAS A NEW IOBYTE JMP MEMCK ;MEMORY LIMIT CHECK JMP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JMP RTS ;SPCL- I/O COMXNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN: PUSH D PUSH H DJNZ INIT1 LXI SP,FAKE-2 ;SET UP TEMPORARY STACK MVI A,0 ; SKIP THE NEXT INST ORG $-1 ;SAVE A BYTE HERzi$NNNNNNNNNNNNNNNNNNH 4NNNNNNNNNNNNNNNNNNNNNNE MONITOR WORKSPACE) AND RETURNS THE VALUE. ; MEMCK: PUSH H ;SAVE (H,L) CALL MEMSIZ ;GET THE RAM SIZE MOV A,L SUI 60 ;TA NNNNNNNNNNNNNNNNNNH&NNNNNNNNNNNNNNNNNNNNNN IT EXPECTS THE FIRST ; CHARACTER OF THE PARAMETER TO BE IN THE A REGISTER ; ON ENTRY. ; EXF: MVI B,1 ;SET UP FOR ONE PARAME.'NNNNNNNNNNNNNNNNNNNH,qNNNNNNNNNNNNNNNNNNNNNN EXPR: LXI H,0 ;INITIALIZE PARAMETER EX0: CALL ECHO ;GET NEXT NUMBER EX1: MOV C,A ;SAVE CHAR FOR LATER USE CALL NIBBLE JR1 NNNNNNNNNNNNNNNNNNHgNNNNNNNNNNNNNNNNNNNNNNPTS: EQU 2 ;NUMBER OF BREAKPOINTS CTRLS: EQU 13H ;ASCII DC3 CR: EQU 0DH ;ASCII CARRIAGE RETURN LF: EQU 0AH ;ASCII LINE FEED }dNNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNC: EQU 13H CLOC: EQU 12H DLOC: EQU 11H ELOC: EQU 10H FLOC: EQU 14H HLOC: EQU 31H LLOC: EQU 30H PLOC: EQU 34H SLOC: EQU 1>)NNNNNNNNNNNNNNNNNNH"}NNNNNNNNNNNNNNNNNNNNNNA SPT: EQU SIDE+1 ;SECTORS PER TRACK HOLD TWOSID: EQU SPT+1 ;SINGLE/DOUBLE SIDED SWITCH HOLD STPRAT: EQU 46H ;STEP RATE SAVE (KdNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNTROL JMP REST ;BREAKPOINT ENTRY POINT ; ; TBL CONTAINS THE ADDRESSES OF THE ACTION ROUTINES ; THE EXECUTIVE USES IT TO LrNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNE ; ; MEMSIZ CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES ; FROM THE BOTTOM UP UNTIL A NON-RAM LOCATION IS ; FOUND. I_NNNNNNNNNNNNNNNNNNNH!NNNNNNNNNNNNNNNNNNNNN!KE OFF WORK SPACE JRNC MEMCK0 DCR H MEMCK0: MOV B,H POP H RET ; FAKE: DW FAKE+2 SPHL LXI D,EXIT XCHG LXI B,ENNNNNNNNNNNNNNNNNNNH'2NNNNNNNNNNNNNNNNNNNNNNTER LXI H,0 JR EX1 ;FIRST CHARACTER IN A ALREADY ; ; ROUTINE EXPR READS PARAMETERS FROM THE CONSOLE ; AND DEVELOPS A 16 4NNNNNNNNNNNNNNNNNNH-BNNNNNNNNNNNNNNNNNNNNNNC EX2 ;NOT A NUMBER, JUMP DAD H ;MULTIPLY BY 16 DAD H DAD H DAD H ORA L ;ADD ON NEW DIGIT MOV L,A JR EX0 ;GO GET N3 NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNFMFD: EQU 0CH ;ASCII FORM FEED BELL: EQU 7 ;ASCII CNTRL CHAR TO RING THE BELL IOBYTE: EQU 3 ;ADDRESS OF I/O CONTROL BYTE SDATHNNNNNNNNNNNNNNNNNNH ݈NNNNNNNNNNNNNNNNNNNNNN7H TLOC: EQU 35H TLOCX: EQU 25H LLOCX: EQU 20H ; APLOC: EQU 9 BPLOC: EQU 11 CPLOC: EQU 10 DPLOC: EQU 13 EPLOC: EQU 12 nNNNNNNNNNNNNNNNNNNH10NNNNNNNNNNNNNNNNNNNNNNAREA STATUS: EQU 47H CMND: EQU STATUS+1 LUNIT: EQU 49H ;LAST USED DRIVE CUNIT: EQU LUNIT+1 ;CURRENT DRIVE RWFLG: EQU 4BH HNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNOOK UP THE DESIRED ADDRESS. ; TBL: DW ASGN DW BOOT DW QPRT DW DISP DW QPRT DW FILL DW GOTO DW HEXN DW INPT D\$NNNNNNNNNNNNNNNNNNHt]NNNNNNNNNNNNNNNNNNNNNNT THEN TAKES OFF FOR MONITOR WORK SPACE ; NEEDS AND RETURNS THE VALUE IN (H,L). ; MEMSIZ: PUSH B ;MONITOR START LOCATION LX&$NNNNNNNNNNNNNNNNNNH"RNNNNNNNNNNNNNNNNNNNNNNDX-EXIT LDIR LXI B,3*NBKPTS PUSH D POP H DCX H LDIR LXI H,-24 DAD SP PUSH H INX H ;ADJUST USER STACK LOCATIOnNNNNNNNNNNNNNNNNNNH( NNNNNNNNNNNNNNNNNNNNNNBIT HEXADECIMAL FOR EACH ONE. ; THE NUMBER OF PARAMETERS WANTED IS IN THE B REG ; ON ENTRY. A CARRIAGE RETURN WILL TERMINATE +[$NNNNNNNNNNNNNNNNNNH.NNNNNNNNNNNNNNNNNNNNNNEXT DIGIT EX2: XTHL ;PUT UNDER RETURN ADDRESS ON STACK PUSH H ;RESTORE RETURN ADDRESS MOV A,C ;REGET THE LAST CHARACTER MNNNNNNNNNNNNNNNNNNHͶNNNNNNNNNNNNNNNNNNNNN!A: EQU 20H ;SERIAL DATA PORT BASE ADDRESS SINTEN: EQU SDATA+1 ;SERIAL INTERRUPT ENABLE REGISTER SIDENT: EQU SDATA+2 ;SERIAL INNNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNFPLOC: EQU 8 HPLOC: EQU 15 LPLOC: EQU 14 XLOC: EQU 7 YLOC: EQU 5 RLOC: EQU 2 ILOC: EQU 3 ; ; DISK CONTROLLER UNIQUE EQUA2fBNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNSTBUF: EQU 4CH ;HOST BUFFER ADDRESS IDSV: EQU 4EH ;DISK ID SAVE AREA TBUF: EQU 80H ; ; ; JUMP TARGETS FOR BASIC INPUT/OUTPUΝNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNW QPRT DW QPRT DW QPRT DW MOVE DW QPRT DW OUPT DW PARM DW QPARM DW READ DW SUBS DW MTEST DW QPRT DW COMP)rNNNNNNNNNNNNNNNNNNHGlNNNNNNNNNNNNNNNNNNNNNNI B,ROM LXI H,-1 ;START OF MEMORY ADDRESS SPACE MEMSZ1: INR H MOV A,M CMA MOV M,A CMP M CMA MOV M,A JRNZ MEMSZ2L$NNNNNNNNNNNNNNNNNNH#aNNNNNNNNNNNNNNNNNNNNNNN INX H SHLD SPSV ;SAVE THE STACK INITIAL VALUE MVI D,10 ;INITIALIZE REGISTER STORAGE AREA INIT2: PUSH B DCR D ;LOOP CONNNNNNNNNNNNNNNNNNH)=NNNNNNNNNNNNNNNNNNNNNNTHE ; ENTRY SEQUENCE; A BLANK OR A COMMA WILL END THE ; CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY ; TAKES THE LAST 4 DIGINNNNNNNNNNNNNNNNNNNNNNSOURCE 2 POINTER MOV B,M ;READ SOURCE 1 DATA CMP B ;COMPARE DATA JRZ CMPB ;JUMP IF OK PUSH PSW ;SAVE SOURCE 2 DATA CALNNNNNNNNNNNNNNNNNNNNH%`NNNNNNNNNNNNNNNNNNNNNNSPLAY THE START ADDRESS MOV A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH H ;SAVE (H,L) DISTNNNNNNNNNNNNNNNNNNH+oNNNNNNNNNNNNNNNNNNNNN! IF NOT JR DIS1 ;DO THE NEXT LINE DIS7: SUB E ;SKIP OVER TO START ASCII PRINTOUT CALL TRPLSP JR DIS3 ;GO PRINT THE ASCII xBNNNNNNNNNNNNNNNNNNHcNNNNNNNNNNNNNNNNNNNNNNR LOGICAL DEVICES ARE ; CONSOLE, READER, LIST, AND PUNCH. IN ALL CASES, ; THE TTY DEVICE IS SET UP AS THE DEFAULT DEVICE. ; NNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNND CPI 'Z'-'A'+1 ;CHECK UPPER LIMIT JRNC QPRT ;BAD COMMAND ADD A ;DOUBLE IT FOR TABLE OFFSET MOV E,A ;SET UP FOR DOUBLE dNNNNNNNNNNNNNNNNNNH&|NNNNNNNNNNNNNNNNNNNNNNITTEN ; AS1: MOV D,B ;SAVE THE COUNTER RESIDUE MVI B,4 ;LOOP CONTROL CALL DECHO ;GET THE NEW ASSIGNMENT AS2: INX H ;INCRE BNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNT TO HIGH SPEED PRINTER DB 'T' ;LIST TO TTY APT: DB 'P' ;LOGIPAL PUNCH DEVICE TABLE DB '2' ;USER DEVICE #2 DB '1' ;USER DbrNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNALTERING ; ANYTHING. ; BYE: MVI B,2 ;SET UP FOR TWO CHARACTERS BYE1: CALL CONI ;GO READ THE CONSOLE CPI BELL ;SEE IF AN AS9rNNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNL LADRB ;WRITE THE ADDRESS MOV A,B ;GET SOURCE 1 DATA CALL DASH1 ;FORMAT POP PSW ;REGET SOURCE 2 DATA CALL HEX1 ;OUTPUT NNNNNNNNNNNNNNNNNNH&3NNNNNNNNNNNNNNNNNNNNNN2: MOV A,M ;GET THE CONTENTS CALL HEX1 ;OUTPUT IT CALL HILO ;INCREMENT, CHECK POINTER JRC DIS7 ;DONE IF CARRY SET CALL BHNNNNNNNNNNNNNNNNNNNH,FNNNNNNNNNNNNNNNNNNNNN! ; TRPLSP: ANI 0FH ;ISOLATE THE LOW FOUR BITS MOV B,A ;PREPARE TO SPACE OVER TO RIGHT COLUMN ADD A ;TRIPLE THE COUNT ADD ϘNNNNNNNNNNNNNNNNNNHP NNNNNNNNNNNNNNNNNNNNNN ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LXI H,ALT ;START OF CONVERSION TABLE LXI D,APT-ALT ;DISTANCE BETWEEN LOGICANNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNADD MVI D,0 MVI B,2 ;SET UP FOR TWO PARAMETERS LXI H,TBL ;GET ACTION ROUTINE ADDRESS DAD D MOV A,M ;LOAD H,L INDIRECT IoINNNNNNNNNNNNNNNNNNHMNNNNNNNNNNNNNNNNNNNNNNMENT POINTER CMP M ;SEE IF THIS IS IT JRNZ AS3 MOV L,B ;SAVE THE RESIDUE TO FORM ASGT DCR L ;ADJUST VALUE MOV B,D ;REG" NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN!EVICE #1 DB 'P' ;PUNCH TO HIGH SPEED PUNCH DB 'T' ;PUNCH TO TTY ART: DB 'R' ;LOGIPAL READER DEVICE TABLE DB '2' ;USER DEVdNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNCII BELL JRNZ BYE ;NO, START OVER AGAIN CALL ECH1 ;ECHO THE BELL DJNZ BYE1 ;NOT YET, GET NEXT ONE RET ;RETURN TO MONITONNNNNNNNNNNNNNNNNNNH!0NNNNNNNNNNNNNNNNNNNNNNIT CMPB: POP B CALL HILOXB ;INCREMENT SOURCE 1 POINTER AND SEE IF DONE JR CMPA ;JUMP IF NOT DONE YET ; ; DISPLAY ACTION RYJ9NNNNNNNNNNNNNNNNNNH'NNNNNNNNNNNNNNNNNNNNNNLK ;MAKE COLUMNS MOV A,L ;READY FOR NEW LINE? ANI 0FH JRNZ DIS2 DIS3: POP H ;REGET LINE START ADDRESS MOV A,L ;SKIP OVE=INNNNNNNNNNNNNNNNNNH-uNNNNNNNNNNNNNNNNNNNNNNB TRPL2: MOV B,A ;PUT BACK INTO B INR B ;ADJUST COUNTER TRPL1: CALL BLK ;DO THE SPACING DJNZ TRPL1 ;NO, DO ANOTHER COLUMN : NNNNNNNNNNNNNNNNNNHɷNNNNNNNNNNNNNNNNNNNNNNL CHOICES MVI B,4 ;NUMBER OF LOGICAL CHOICES AS0: CMP M ;IS THIS ONE IT? JRZ AS1 ;YES, JUMP DAD D ;NO, GO TO NEXT LOGICAL3NNNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNN INX H MOV H,M MOV L,A PCHL ;GO TO ACTION ROUTINE ; ; FILL ACTION ROUTINE ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY W09NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNET THE LOGICAL RESIDUE MVI H,3 ;SET UP THE IOBYTE MASK DCR B ;ADJUST THIS ONE ALSO JRZ AS5 ;NO SHIFT NEEDED AS4: DAD H ;SGNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN!ICE #2 DB '1' ;USER DEVICE #1 DB 'P' ;READER TO HIGH SPEED READER DB 'T' ;READER TO TTY ACT: DB 'C' ;LOGIPAL CONSOLE DEVIXyNNNNNNNNNNNNNNNNNNHCmNNNNNNNNNNNNNNNNNNNNN!R ; ; COMPARE ROUTINE ; ;THIS ROUTINE COMPARES TWO BLOCKS OF MEMORY AGAINST EACH ; OTHER. IF ADIFFERENCE IN THE RELATIVE صHNNNNNNNNNNNNNNNNNNH"eNNNNNNNNNNNNNNNNNNNNNNOUTINE ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE ; CURRENT CONSOLE DEVICE (CONSOLE DUMP). THE USER ; MUST SPECIFY { NNNNNNNNNNNNNNNNNNH({BNNNNNNNNNNNNNNNNNNH @NNNNNNNNNNNNNNNNNNNNNN FINISH ADDRESS ; FILL VALUE ; FILL: CALL EXPR3 ;GET THREE PARAMETERS FI0: MOV M,C ;PUT DOWN THE FILL VALUE CALL HILO ;INCU!NNNNNNNNNNNNNNNNNNH`bNNNNNNNNNNNNNNNNNNNNNNRA H ;LOGICAL ASGT BITS NOW OFF ORA L ;PUT IN NEW VALUE MOV C,A IOSET: MOV A,C STA IOBYTE ;SAVE NEW ASSIGNMENTS RET IO f NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE ; OF THE SYSTEM. THE SYSTEM LOCKS UP AND WILL NOT ; RESPOND TO ANNNNNNNNNNNNNNNNNNNH%NNNNNNNNNNNNNNNNNNNNNNER BLOCK'S SAME RELATIVE ADDRESS. ; COMP: CALL EXPR3 ;GO GET THREE PARAMETERS CMPA: LDAX B ;GET SOURCE 2 DATA PUSH B ;SAVE {NNNNNNNNNNNNNNNNNNNH$QNNNNNNNNNNNNNNNNNNNNNNNED SO ; EACH COLUMN HAS THE SAME LAST HEX DIGIT IN ITS ADDRESS. ; DISP: CALL EXLF ;GO GET BLOCK LIMITS DIS1: CALL LADRB ;DIv!NNNNNNNNNNNNNNNNNNH*^NNNNNNNNNNNNNNNNNNNNNN: CALL CONOUT CALL HILOX ;INCREMENT (H,L) AND SEE IF DONE MOV A,L ;NOT DONE, READY FOR NEW LINE? ANI 0FH JRNZ DIS4 ;JUMPHNNNNNNNNNNNNNNNNNNNH0NNNNNNNNNNNNNNNNNNNNNNACTIVE. ; GOTO: CALL PCHK ;SEE IF OLD ADDRESS WANTED JRC GO3 ; YES, JUMP JRZ GO0 ; YES, BUT SET SOME BREAKPOINTS CALL rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNҁp?݅{J艷U%Îa0ϒm< ږxG嚴R!𞿟],ʣh8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIwNNNNNNNNNNNNNNNNNNNNN!EXF ;GET NEW GOTO ADDRESS POP D LXI H,PLOC ;PUT ADDRESS IN PC LOCATION DAD SP MOV M,D ;LOW BYTE DCX H MOV M,E ;HInBNNNNNNNNNNNNNNNNNNI`NNNNNNNNNNNNNNNNNNNNNNET THE DELIMITER TO SEE CPI CR ; IF WE ARE DONE SETTING BREAKPOINTS POP B ; UNLOAD THE STACK FIRST JRZ GO3 ;YES, JUMP zBNNNNNNNNNNNNNNNNNNI 2NNNNNNNNNNNNNNNNNNNNNNTER JR BITS2 ;GO DO A BINARY PRINT OF THE VALUE ; OUPT: CALL EXPR ;GET THE ADDRESS AND DATA FOR OUPTUT POP D ;DATA VALUE IyNNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNENTERING A SPACE, COMMA, OR A CARRIAGE RETURN. IF ; A CARRIAGE RETURN IS ENTERED, THE ROUTINE IS TERMINATED. ; IF A SPACE OR $NNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!ER CPI CR ;SEE IF DONE (CARRIAGE RETURN) RZ ;YES, RETURN TO MONITOR SUB2: INX H ;NO, INCREMENT MEMORY POINTER INX H ;ALLRfyNNNNNNNNNNNNNNNNNNIWNNNNNNNNNNNNNNNNNNNNNNA CALL HILOX ;POINT TO NEXT AND SEE IF DONE JR MTEST1 ;NO, CONTINUE ; BITS: PUSH D ;SAVE (D,E) MOV E,A ;SAVE ERROR PATTE"BNNNNNNNNNNNNNNNNNNI%NNNNNNNNNNNNNNNNNNNNNN ON TEST VALUE JR XAC XAB: ANI 7FH ;RESET BIT 7 XAC: DCR M ;TO BE PULLED OUT IN ROM CMP M ;SEE IF THIS IS IT JRNZ XAA ;!NNNNNNNNNNNNNNNNNNI+NNNNNNNNNNNNNNNNNNNNNNE POINTER XF: MOV A,C ;SEE IF IT WAS A CR CPI CR RZ ;DONE IF SO XMNE: LXI H,ACTBL ;GET ADDRESS OF REGISTER LOOK-UP TAByNNNNNNNNNNNNNNNNNNI"NNNNNNNNNNNNNNNNNNNNNNGH BYTE MOV A,C CPI CR ;SEE IF A CR WAS LAST ENTERED JRZ GO3 GO0: MVI B,NBKPTS LXI H,TLOC ;POINT TO TRAP STORAGE D2NNNNNNNNNNNNNNNNNNI^NNNNNNNNNNNNNNNNNNNNNNDJNZ GO1 ;JUMP IF NOT AT BP LIMIT GO3: CALL CRLF POP H ;GET RID OF STACK JUNK LXI H,RS9 PUSH H LXI H,REST SHLD 9 ;SrNNNNNNNNNNNNNNNNNNIgNNNNNNNNNNNNNNNNNNNNNNNTO E POP B ;PORT INTO C OUTP E ;DO THE OUTPUT RET ; ; MOVE ROUTINE ; ; THIS ROUTINE EXPECTS THREE PARAMETERS, ENTERE(BNNNNNNNNNNNNNNNNNNI@NNNNNNNNNNNNNNNNNNNNN!COMMA IS ENTERED, THE ROUTINE ; PROCEEDS TO THE NEXT LOCATION AND PRESENTS THE USER ; WITH AN OPPORTUNITY TO ALTER IT. ; SUBNNNNNNNNNNNNNNNNNNIONNNNNNNNNNNNNNNNNNNNNNOW A FALL-THROUGH ON THE NEXT INSTRUCTION SUB3: DCX H ;ADJUST (H,L) AS APPROPRIATE MOV A,L ;GET LO ADDRESS BYTE ANI 7 ;SEE >INNNNNNNNNNNNNNNNNNI BNNNNNNNNNNNNNNNNNNNNN!RN IN E CALL LADRB ;FIRST PRINT THE ADDRESS BITS2: MVI B,8 ;LOOP CONTROL FOR 8 BITS BITS1: MOV A,E ;GET NEXT BIT RLC ; INNNNNNNNNNNNNNNNNNI&NNNNNNNNNNNNNNNNNNNNN!NO, GO TRY AGAIN CALL BLK ;YES, PREPARE TO SHOW CURRENT VALUE CALL PRTVAL ;GO PRINT THE VALUE CALL DASH ;PROMPT A NEW VA}[NNNNNNNNNNNNNNNNNNNNI,|NNNNNNNNNNNNNNNNNNNNN!LE XMNE1: CALL PCHK ;FIND OUT WHAT ACTION IS WANTED JRC XG ;SHOW ALL IF CARRIAGE RETURN JRZ XMNE1 ;IGNORE BLANKS OR COMMAS!BNNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNAD SP GO1: PUSH B ;SAVE NUMBER OF BREAKPOINTS PUSH H ;SAVE STORAGE POINTER MVI B,2 ;SET UP TO GET A TRAP ADDRESS CALL EXSNNNNNNNNNNNNNNNNNNI oNNNNNNNNNNNNNNNNNNNNNNET BREAKPOINT JUMP VECTOR ADDRESS LXI H,24 ;FIND REGISTER SET ROUTINE ADDRESS DAD SP POP D ;ADJUST THE STACK PCHL ;GO TRNNNNNNNNNNNNNNNNNNNITNNNNNNNNNNNNNNNNNNNNNND IN THE FOLLOWING ORDER: ; SOURCE FIRST BYTE ADDRESS ; SOURCE LAST BYTE ADDRESS ; DESTINATION FIRST BYTE ADDRESS ; MOVE: C NNNNNNNNNNNNNNNNNNIqNNNNNNNNNNNNNNNNNNNNNNS: CALL EXPR1 ;GO GET ONE PARAMETER POP H ;GET THE START ADDRESS SUB1: MOV A,M ;GET THE CONTENTS OF THE ADDRESS CALL DASH1 bNNNNNNNNNNNNNNNNNNI~NNNNNNNNNNNNNNNNNNNNNNIF ON A BOUNDARY CZ LADRB ;CALL IF ON THE BOUNDARY JR SUB1 ;GO DO THE NEXT LOCATION ; ; MTEST ROUTINE TESTS A SPECIFIED BL_HNNNNNNNNNNNNNNNNNNNI!q NNNNNNNNNNNNNNNNNNNNNNNTO CARRY MOV E,A ;SAVE REST MVI A,'0'/2 ;BUILD ASCII 1 OR 0 RAL ; CARRY DETERMINES WHICH MOV C,A ;NOW, OUPTUT IT CA$>!NNNNNNNNNNNNNNNNNNI'ۆNNNNNNNNNNNNNNNNNNNNNNLUE CALL PCHK ;GET THE INPUT RC ;DONE IF CARRIAGE RETURN JRZ XF ;JUMP IF NO CHANGE DESIRED PUSH H ;TO BE CHANGED, SA/ NNNNNNNNNNNNNNNNNNI-4MNNNNNNNNNNNNNNNNNNNNNN CPI '''' ;SEE IF PRIMES WANTED JRNZ XA ;NO, MUST BE SINGLE REGISTER LXI H,PRMTB ;YES, SET TABLE ADDRESS JR XMNE1 ; ANDHNNNNNNNNNNNNNNNNNNI3NNNNNNNNNNNNNNNNNNNNNNPR1 ;GET A TRAP ADDRESS POP D ;GET THE TRAP ADDRESS INTO (D,E) POP H ;REGET THE STORAGE ADDRESS MOV A,D ;INSURE THE TRAP A $NNNNNNNNNNNNNNNNNNI 0NNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNK OR , CPI LF ;SEE IF PREVIOUS BYTE WANTED JRZ SUB3 ;YES, DO IT PUSH H ;SAVE MEMORY POINTER CALL EXF ;GO GET REST OF NEW5NNNNNNNNNNNNNNNNNNI1NNNNNNNNNNNNNNNNNNNNNN; OF THE MEMORY'S OPERATIVENESS. ; MTEST: CALL EXLF MTEST1: MOV A,M ;READ A BYTE PUSH PSW ;SAVE IT CMA ;COMPLEMENT IT _NNNNNNNNNNNNNNNNNNI#BNNNNNNNNNNNNNNNNNNNNNNSTORED BY THE LAST ENCOUNTERED BREAKPOINT. ; THE VALUES MAY BE MODIFIED IF DESIRED. ; XAA: INX H ;SKIP OVER TO NEXT ENTRY NNNNNNNNNNNNNNNNNNI)NNNNNNNNNNNNNNNNNNNNNN D ;PUT IT DOWN XTHL ;RECOVER THE TABLE POINTER MOV A,M ;GET THE ATTRIBUTES XTHL ;SET THE STACK STRAIGHT RLC ;SEE IFNNNNNNNNNNNNNNNNNNI/R/NNNNNNNNNNNNNNNNNNNNN! BIT 7 IS SET CALL CONOUT CALL DASH ;PROMPT FOR A NEW VALUE CALL PRTVAL ;GO PRINT THE VALUE CALL BLK ;FORMATTER INX HBNNNNNNNNNNNNNNNNNNIQNNNNNNNNNNNNNNNNNNNNN!AVE THE INSTRUCTION FROM THE BP ADDRESS MOV M,A INX H MVI A,RST OR 8 ;INSERT THE BREAKPOINT STAX D GO2: MOV A,C ;REGNNNNNNNNNNNNNNNNNNI NNNNNNNNNNNNNNNNNNNNNNON THE CONSOLE. ; INPT: CALL EXPR1 ;GET INPUT PORT NUMBER POP B ;GET PORT # INTO C REGISTER INP E ;READ VALUE INTO E REGISY(NNNNNNNNNNNNNNNNNNI!NNNNNNNNNNNNNNNNNNNNNNEMORY LOCATION ; AND ALTER THE CONTENTS, IF DESIRED AND IF THE ADDRESS ; IS IN RAM. THE CONTENTS MAY BE LEFT UNALTERED ; BY {NNNNNNNNNNNNNNNNNNI-NNNNNNNNNNNNNNNNNNNNNN VALUE POP D ;NEW VALUE TO E REGISTER POP H ;RESTORE MEMORY POINTER MOV M,E ;PUT DOWN NEW VALUE MOV A,C ;GET THE DELIMIT f NNNNNNNNNNNNNNNNNNIdNNNNNNNNNNNNNNNNNNNNNN MOV M,A ;WRITE IT XRA M ;RESULT SHOULD BE ZERO CNZ BITS ;LOG ERROR IF NOT MTEST2: POP PSW ;RESTORE ORIGINAL BYTE MOV M,NNNNNNNNNNNNNNNNNNI$NNNNNNNNNNNNNNNNNNNNNN INX H XA: INR M ;SEE IF AT END OF TABLE RZ ;COULDN'T FIND MATCH, QUIT JP XAB ;SORT OUT BIT 7 OF TABLE ORI 80H ;SET IT3NNNNNNNNNNNNNNNNNNNNI*NNNNNNNNNNNNNNNNNNNNNN 8 BIT REGISTER JRNC XE ;JUMP IF SO INX D ;REGISTER PAIR, DO OTHER 8 BITS MOV A,H STAX D XE: POP H ;RESTORE THE TABL5WHNNNNNNNNNNNNNNNNNNNI0AbNNNNNNNNNNNNNNNNNNNNNNH ;POINT TO NEXT ENTRY JR XG ;DO THE NEXT VALUE ; PRTVAL: INX H ;POINT TO NEXT ENTRY MOV A,M ;GET OFFSET AND ATTRIBUTES BYptdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMnNNŃm< څyI牶T$Ž`/Βl; ٖwF嚴S"^.̣j: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNI@NNNNNNNNNNNNNNNNNNNNNNTE ANI 3FH ;ISOLATE THE OFFSET ADI 2 ;ALLOW FOR RETURN ADDRESS XCHG ;SWAP POINTERS MOV L,A ;BUILD THE ADDRESS OF THE RENNNNNNNNNNNNNNNNNNIPNNNNNNNNNNNNNNNNNNNNNNLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H+'M',HLOC+0C0H DB 'P',PLOC+80H DB 'S',SLOC NNNNNNNNNNNNNNNNNNNNI NNNNNNNNNNNNNNNNNNNNNNCONSOLE ; DEVICE, THEN ECHOES THE CHARACTER BACK TO THE ; CONSOLE. ; DECHO: CALL DASH ;PRINT A DASH ECHO: CALL CONI ;CONSOL;NNNNNNNNNNNNNNNNNNNI%NNNNNNNNNNNNNNNNNNNNNNTURN. IF NO WRAP- ; AROUND OCCURRED, (H,L) IS COMPARED TO (D,E) AND ; THE FLAG BITS SET ACCORDINGLY. ; HILO: INX H ;INCREME NNNNNNNNNNNNNNNNNNI,NNNNNNNNNNNNNNNNNNNNNNNI ;SEE IF WAIT OR BREAK CPI CTRLS JRNZ HILOD ;JUMP IF BREAK JMP CONI ;WAIT FOR ANY INPUT ; ; ROUTINE NIBBLE CONVERTS THUNNNNNNNNNNNNNNNNNNI`NNNNNNNNNNNNNNNNNNNNNNRNED. ; IF IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE DELIMITER IS A CARRIAGE RETURN, ; THE CARRY BITCrNNNNNNNNNNNNNNNNNNI%NNNNNNNNNNNNNNNNNNNNN! REGISTERS PUSH D PUSH B PUSH PSW CALL MEMSIZ ;GET THE MONITOR'S STACK LOCATION XCHG LXI H,10 ;GO UP 10 BYTES IN THE5NNNNNNNNNNNNNNNNNNNI+NNNNNNNNNNNNNNNNNNNNNN USER (H,L) INX H MOV M,D PUSH B ;SAVE (B,C) MVI C,'*' ;TYPE THE BREAK INDICATION CALL CONOUT POP D ;REGET THE BREAKc9NNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!G CONTENTS MVI H,0 DAD SP XCHG ;RE-SWAP THE POINTERS MOV A,M ;NOW FIND OUT ATTRIBUTES MVI B,1 ;SET UP FOR SINGLE REG VHNNNNNNNNNNNNNNNNNNNInNNNNNNNNNNNNNNNNNNNNNN+80H DB 'I',ILOC ; ; REST OF Z-80 REGISTER OFFSETS ; PRMTB: DB 80H+'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC rNNNNNNNNNNNNNNNNNNIPNNNNNNNNNNNNNNNNNNNNNNE READ, WRITE ROUTINE ECH1: PUSH B ; SAVE (B,C) MOV C,A ; PASS CHARACTER IN C REGISTER CALL CONOUT ; OUTPUT IT MOV A,CNNNNNNNNNNNNNNNNNNIpNNNNNNNNNNNNNNNNNNNNNNNT (H,L) MOV A,H ;TEST IF ZERO ORA L ; IN (H,L) STC ;SET CARRY FOR (H,L)=0 RZ ;RETURN IF (H,L) = 0 MOV A,E ;COMPAREkdNNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNE ASCII CHARACTERS 0-9 AND ; A-F TO THEIR EQUIVELANT HEXADECIMAL VALUE. IF ; THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS RrNNNNNNNNNNNNNNNNNNI u!NNNNNNNNNNNNNNNNNNNNNN IS SET. A BLANK OR A COMMA RESET THE ; CARRY BIT. ; PCHK: CALL ECHO ;GET, TEST FOR DELIMITER P2C: CPI ' ' ; BLANK? RZ (dNNNNNNNNNNNNNNNNNNI&߇NNNNNNNNNNNNNNNNNNNNNN STACK DAD SP ; TO SKIP OVER TEMP REGISTER SAVE MVI B,4 ;PICK OFF THE REGISTER VALUES XCHG RS1: DCX H MOV M,D ;SAVE IN$NNNNNNNNNNNNNNNNNNNI,0LNNNNNNNNNNNNNNNNNNNNNNPOINT LOCATION MVI A,RS9/256 CMP D ;SEE IF A RET BREAKPOINT JRZ RS6 INX H INX H MOV M,E ;RESTORE USER PROGRAM COUNTEtBNNNNNNNNNNNNNNNNNNI&NNNNNNNNNNNNNNNNNNNNNNVALUE RLC JRNC PV1 ;JUMP IF SINGLE REGISTER VALUE WANTED INR B ;SET UP FOR REGISTER PAIR RLC JRNC PV1 ;JUMP IF REGISTE=NNNNNNNNNNNNNNNNNNI _NNNNNNNNNNNNNNNNNNNNNN DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 80H+'M',HPLOC+0C0H DB 'X',XLOC+80H DB 'Y',YLOC+80H DB 'R'kINNNNNNNNNNNNNNNNNNIcNNNNNNNNNNNNNNNNNNNNNN ; PUT CHARACTER BACK INTO A POP B ; RESTORE (B,C) RET ; ; ROUTINE EXPR3 GETS THREE PARAMETERS, DOES A CR, LF AND ; 6NNNNNNNNNNNNNNNNNNIANNNNNNNNNNNNNNNNNNNNNN (H,L) TO (D,E) SUB L MOV A,D SBB H RET ;RETURN WITH FLAGS SET ; ; ROUTINE HILOX INCREMENTS (H,L), COMPARES IT TO (D,@NNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNNSET TO ; FLAG THE ERROR. ; NIBBLE: SUI '0' ;ASCII TO HEX CONVERSION RC ; DONE IF OUT OF RANGE CPI 'G'-'0' ;CHECK UPPER iNNNNNNNNNNNNNNNNNNNNI!FNNNNNNNNNNNNNNNNNNNNNN; YES, DONE CPI ',' ; NO, COMMA? RZ ; YES, DONE CPI CR ; NO, CARRIAGE RETURN? STC ; SHOW IT IN CARRY BIT RZ ; vYNNNNNNNNNNNNNNNNNNI'NNNNNNNNNNNNNNNNNNNNNN WORK AREA DCX H MOV M,E POP D DJNZ RS1 POP B ;GET THE BREAKPOINT LOCATION DCX B SPHL ;SET THE MONITOR STACK LX+NNNNNNNNNNNNNNNNNNI-}NNNNNNNNNNNNNNNNNNNNNNR INX H MOV M,D XCHG ;PRINT THE BREAKPOINT LOCATION CALL LADR RS6: LXI H,TLOCX DAD SP LXI B,NBKPTS*256 RS7: MOV E<NNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!R PAIR IS NEXT PUSH H ;SPECIAL CASE FOR MEMORY REGISTER LDAX D ;BUILD ADDRESS IN (H,L) MOV H,A DCX D LDAX D MOV L,A NNNNNNNNNNNNNNNNNNI NNNNNNNNNNNNNNNNNNNNNN,RLOC DB 0FFH ; ; GENERAL PURPOSE ROUTINES ; ; ; ROUTINE CONV CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS)rNNNNNNNNNNNNNNNNNNIpNNNNNNNNNNNNNNNNNNNNN! THEN LOADS (B,C), (D,E), AND (H,L) WITH THE PARAMETERS. ; EXPR3: INR B ;2 IS ALREADY IN THE B REGISTER CALL EXPR ;GET THE (f NNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNE) AND ; IF EQUAL, RETURNS CONTROL TO THE MONITOR EXECUTIVE. ; OTHERWISE, CONTROL RETURNS TO THE CALLING ROUTINE. ; HILO2!NNNNNNNNNNNNNNNNNNI5NNNNNNNNNNNNNNNNNNNNNNEND CMC ; TOGGLE THE CARRY BIT RC ; DONE IF OUT OF RANGE CPI '9'-'0'+1 ;SEE IF NUMERIC CMC ; TOGGLE THE CARRY BITXNNNNNNNNNNNNNNNNNNI"CNNNNNNNNNNNNNNNNNNNNNN DONE IF CR CMC ;CLEAR CARRY FOR NO DELIMITER RET ; ; ; ROUTINE REST TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A ; REdNNNNNNNNNNNNNNNNNNI(NNNNNNNNNNNNNNNNNNNNNNI H,TLOCX ;SET UP TO RESTORE BREAKPOINTS DAD SP PUSH D MVI D,NBKPTS ;LOOP CONTROL FOR N BREAKPOINTS RS2: MOV A,M SUB C %e NNNNNNNNNNNNNNNNNNI.V.NNNNNNNNNNNNNNNNNNNNNN,M ;RESTORE BREAKPOINTED LOCATIONS MOV M,C ;RESET SYSTEM BP SAVE AREA INX H MOV D,M MOV M,C INX H MOV A,E ORA D NNNNNNNNNNNNNNNNNNNI2NNNNNNNNNNNNNNNNNNNNNN MOV A,M ;GET THE MEMORY VALUE POP H ;RESTORE (H,L) DJNZ PV2 ;ALWAYS JUMP PV1: LDAX D ;GET THE REGISTER CONTENTS PV2: CAL5Q NNNNNNNNNNNNNNNNNNI =NNNNNNNNNNNNNNNNNNNNNN ASCII EQUIVELANT. IT ; PUTS THE RESULT INTO C FOR LATER OUTPUT. ; CONV: ANI 0FH ;STRIP OFF BITS 4-7 ADI 90H ;PUT ON THE AHNNNNNNNNNNNNNNNNNNNICNNNNNNNNNNNNNNNNNNNNNNPARAMETERS POP B ;PUT PARAMETERS INTO REGISTERS POP D JMP CRLFA ;GO DO THE CARRIAGE RETURN SEQUENCE ; ; ROUTINE HILO INCt^ NNNNNNNNNNNNNNNNNNI#NNNNNNNNNNNNNNNNNNNNNND: POP D ;GET RID OF RETURN ADDRESS RET ;RETURN TO MONITOR HILOXB: INX B ;INCREMENT (B,C) HILOX: CALL HILO ;INC AND CHECK (~rNNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN! RNC ; DONE IF SO SUI 'A'-'9'-1 ;SUBTRACT THE ALPHA BIAS CPI 10 ; SET CARRY FOR INVALID CHAR RET ; ; ROUTINE PCHK $INNNNNNNNNNNNNNNNNNI# rNNNNNNNNNNNNNNNNNNNNNNSTART 1 INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ; ARE STORED IN THE SYSTEM STACK AREA FOR LATER ACCESS AND ; USE BY THENNNNNNNNNNNNNNNNNNI)ϹNNNNNNNNNNNNNNNNNNNNNN;SEE IF A SOFTWARE TRAP INX H MOV A,M SBB B ;MAYBE, TRY REST OF ADDRESS JRZ RS5 ;FOUND ONE, JUMP TO RESET IT RS3: INX HNNNNNNNNNNNNNNNNNNI/eNNNNNNNNNNNNNNNNNNNNNNJRZ RS8 ;DO NOTHING IF ZERO MOV A,M STAX D RS8: INX H ;SAME THING FOR OTHER DJNZ RS7 ; BREAKPOINT EXAF ;NOW SAVE THE Z\NNNNNNNNNNNNNNNNNNIaNNNNNNNNNNNNNNNNNNNNNNL HEX1 ;OUTPUT THE VALUE DCX D ;ADJUST THE MEMORY POINTER DJNZ PV1 RET ; ACTBL: DB 80H+'A',ALOC DB 'B',BLOC DB 'C',CNNNNNNNNNNNNNNNNNNNNI 6NNNNNNNNNNNNNNNNNNNNNNSCII ZONE DAA ACI 40H DAA MOV C,A ;PUT IN OUTPUT PASS REGISTER RET ; ; ROUTINE ECHO READS A BYTE FROM A HALF-DUPLEX ¸NNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!REMENTS (H,L). IT THEN CHECKS FOR (AND ; DISALLOWS) A WRAP-AROUND SITUATION. IF IT OCCURS, ; THE CARRY BIT WILL BE SET ON REsNNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNH,L) JRC HILOD ;DONE IF CARRY SET CALL CONST ;SEE IF CONSOLE BREAK PENDING ORA A RZ ;NONE, RETURN TO CONTINUE CALL COdNNNNNNNNNNNNNNNNNNISNNNNNNNNNNNNNNNNNNNNNNREADS A CHARACTER FROM THE CONSOLE, THEN ; CHECKS IT FOR A DELIMITER. IF IT IS NOT ; A DELIMITER, A NON-ZERO CONDITION IS RETU(rNNNNNNNNNNNNNNNNNNI$NNNNNNNNNNNNNNNNNNNNNN GOTO AND THE EXAMINE REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST: REST: PUSH H ;SAVE ALL THEKNNNNNNNNNNNNNNNNNNNI*NNNNNNNNNNNNNNNNNNNNN! ;NOT FOUND, TRY NEXT ONE INX H DCR D JRNZ RS2 RS4: INX B ;NONE FOUND RS5: LXI H,LLOCX POP D DAD SP MOV M,E ;STOREU6'NNNNNNNNNNNNNNNNNNNI0vRNNNNNNNNNNNNNNNNNNNNNN-80 UNIQUES EXX E5 PUSH H PUSH D PUSH B PUSH PSW PUSHIX PUSHIY LDAI MOV B,A LDAR MOV C,A PUSH B jTrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNҁp?݅|LꉹW&Ďb1ϒm< ږxG嚴S"^-ˣi9 nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN JMP WINITA ;RETURN TO MONITOR RS9: PUSH H ;RET BREAKPOINT ENCOUNTERED, ADJUST THE STACK RST 1 ;DO THE BREAKPOINT ; EXIT: PEyNNNNNNNNNNNNNNNNNNJFNNNNNNNNNNNNNNNNNNNNNNVALUE STA IOBYTE LXI H,IOMSG ;GET ADDRESS OF I/O ERROR MSG JMP COMERR ;GO PROCESS IT ; IOMSG: DB 'I/O ER','R'+80H DERMSlNNNNNNNNNNNNNNNNNNJ wNNNNNNNNNNNNNNNNNNNNNNDMST ;WAIT FOR START BIT ANA E JRZ I8250A I8250B: IN SMDMST ;NOW, TIME THE START BIT DURATION INX H ANA E ANA E JNZBNNNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNNN CPI 0DH ;SEE IF IT IS A CARRIAGE RETURN POP H ;SET THE STACK STRAIGHT RZ ;DONE IF CARRIAGE RETURN RECEIVED MOV E,L ;EL:9NNNNNNNNNNNNNNNNNNJfNNNNNNNNNNNNNNNNNNNNNNRITE ;ELSE, DO THE WRITE JR RW3 RW2: CALL DREADH ;DO THE READ RW3: POP D JRNZ DERROR ;JUMP IF ERROR LDA SPT ;GET THE SECgYrNNNNNNNNNNNNNNNNNNJfNNNNNNNNNNNNNNNNNNNNNNVI M,0 ; AND THE SECTOR POINTER RW5: INR M POP H ;RESTORE THE DMA ADDRESS DCX H CALL HILOX ;SEE IF DONE PUSH D ;CONTINwFNNNNNNNNNNNNNNNNNNJ%&8NNNNNNNNNNNNNNNNNNNNNNRCE A DISK DETERMINATION CALL DREADH ;GO GET A SECTOR JRNZ DERROR ;QUIT IF AN ERROR ENCOUNTERED MVI A,2 ;GET SECTOR 2, ALSCNNNNNNNNNNNNNNNNNNNNJ+7NNNNNNNNNNNNNNNNNNNNN!R IS CHECKED FOR ERRORS. ; ; THIS ROUTINE MUST BE CALLED BEFORE USE OF EITHER ; THE DISK READ OR WRITE ROUTINE. ; PARM: CALrNNNNNNNNNNNNNNNNNNJINNNNNNNNNNNNNNNNNNNNNNOP B MOV A,C STAR MOV A,B STAI POPIX POPIY POP PSW POP B POP D POP H EXAF EXX POP D POP B POP PSNNNNNNNNNNNNNNNNNNNJVNNNNNNNNNNNNNNNNNNNNNNG: DB 'DSK ERR: U','-'+80H DB ' T','-'+80H DB ' S','-'+80H DB ' C','-'+80H DB ' E','-'+80H DB CR,LF+80H QMSG: DB '???MNNNNNNNNNNNNNNNNNNJ$NNNNNNNNNNNNNNNNNNNNN! I8250B PUSH H ;SAVE COUNT IN CASE OF 4 MHZ DAD H ;PREPARE THE 2 MHZ DIVISOR MOV E,H ;SET UP THE FUDGE FACTOR DAD D ;APPWNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNN!SE, MUST BE 4 MHZ SYSTEM MOV D,H ; SO, COUNT=COUNT*5/4 CALL DIV2 CALL DIV2 DAD D PUSH H JR I8250D ;GO SET THE NEW DI/NNNNNNNNNNNNNNNNNNJ3NNNNNNNNNNNNNNNNNNNNNNTORS PER TRACK MOV B,A ;SAVE IT IN DTRCK ;SEE IF ON TRACK 00 ORA A JRNZ RW4 ;JUMP IF NOT MVI B,26 ;ELSE, SET THE SECTO¥NNNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNN!UE IF CONTROL RETURNED JR RW1 ; ; ROUTINE DINIT CHECKS THE 2422'S AUTO-BOOT CONTROL BIT ; DURING INITIALIZATION. IT THEN TINNNNNNNNNNNNNNNNNNJ&skNNNNNNNNNNNNNNNNNNNNNNO STA SECTOR CALL DREADH JZ TBUF ;GO TO THE LOADER ; DERROR: LXI H,DERMSG ;ADDRESS OF DISK ERROR MESSAGE CALL PRTWD ;)2!NNNNNNNNNNNNNNNNNNJ,NNNNNNNNNNNNNNNNNNNNNNL EXPR3 ;GET THE THREE PARAMETERS MOV A,L ;ERROR CHECK THE UNIT ASSIGNMENT ORA A JM QPRT CPI 4 JNC QPRT STA DISKNO ;_+BNNNNNNNNNNNNNNNNNNJxNNNNNNNNNNNNNNNNNNNNNNW POP H SPHL DB 0 ;PLACE FOR EI LXI H,0 JMP 0 ENDX: EQU $ ; ; ERROR HANDLERS ; ; THREE TYPES OF ERRORS ARE DETECTT=NNNNNNNNNNNNNNNNNNJ eNNNNNNNNNNNNNNNNNNNNNN','?'+80H LOGMSG: DB 'MOSS VERS 2.2' DB CR,LF+80H ; ; ; INITIALIZATION CODE FOR THE 8250 ASYNCHRONOUS COMMUNICATION ; Ej~NNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNN!LY THE FUDGE FACTOR DAD D PUSH H ;SAVE FOR LATER USE DAD H ;WAIT FOR 8 BIT TIMES DAD H I8250C: IN SDATA ;WASTE SOME TIMXrNNNNNNNNNNNNNNNNNNJ#NNNNNNNNNNNNNNNNNNNNNNVISOR ; ; DIV2: ORA A ;CLEAR THE CARRY BIT MOV A,H ;DO A 16-BIT RIGHT SHIFT RAR MOV H,A MOV A,L RAR MOV L,A REThNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNN!RS PER TRK 00 LDA CUNIT ANI 10H JRNZ RW4 MVI B,18 ;MINI DRIVES RW4: PUSH H ;SAVE THE DMA ADDRESS LXI H,SECTOR ;SET U˟!NNNNNNNNNNNNNNNNNNJ!NNNNNNNNNNNNNNNNNNNNNNRANSFERS ; CONTROL TO EITHER THE MONITOR OR THE BOOTSTRAP, ; AS APPROPRIATE. ; DINIT: IN DCNTL ;SEE IF AUTO-BOOT WANTED ANMNNNNNNNNNNNNNNNNNNJ'@ZNNNNNNNNNNNNNNNNNNNNNNSTART THE MESSAGE LDA DISKNO ;DO THE UNIT ASSIGNMENT CALL DERR1 LDA TRACK ;AND THE TRACK CALL DERR1 LDA SECTOR ;AND TH NNNNNNNNNNNNNNNNNNJ-NNNNNNNNNNNNNNNNNNNNN!SET THE UNIT SELECT MOV L,E ;MOVE THE SECTORS PER TRACK OVER MOV H,C ; AND THE TWO-SIDED SWITCH SHLD SPT ;STORE THEM RENNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNED: A RESTART ; ERROR; AN I/O ASSIGNMENT ERROR; AND CERTAIN PROGRAM ; ERRORS (DETERMINED BY THE PARTICULAR ROUTINE WHERE ; T@rNNNNNNNNNNNNNNNNNNJ 0NNNNNNNNNNNNNNNNNNNNNNLEMENT. THIS CODE WILL INITIALIZE THE BAUD RATE OF THE ; 8250, AS WELL AS THE WORD FORMAT. 8 DATA BITS, 1 STOP BIT, ; ANrNNNNNNNNNNNNNNNNNNJXNNNNNNNNNNNNNNNNNNNNN!E DCX H MOV A,L ORA H JNZ I8250C POP H ;REGET 2 MHZ DIVISOR I8250D: MVI A,83H ;SET DIVISOR REGISTER ACCESS OUT SLCTt$ NNNNNNNNNNNNNNNNNNJvNNNNNNNNNNNNNNNNNNNNNN ; ; READ: MVI A,1 ;SET THE READ/WRITE FLAG ORG $-1 ;SAVE A BYTE HERE WRITE: XRA A ;RESET THE READ/WRITE FLAG STA RWFLG !NNNNNNNNNNNNNNNNNNJ5NNNNNNNNNNNNNNNNNNNNNNP MEMORY POINTER MOV A,M ;GET NUMBER OF SECTORS CMP B ;SEE IF TRACK OVERFLOW JRC RW5 ;JUMP IF NOT LDA TWOSID ;SEE IF DOUNNNNNNNNNNNNNNNNNNJ"NNNNNNNNNNNNNNNNNNNNNNI 40H RNZ ;NO, RETURN TO MONITOR INITIALIZATION ; ; ROUTINE BOOT LOADS IN THE FIRST TWO SECTORS OF ; DRIVE 00 INTO LOCATIOINNNNNNNNNNNNNNNNNNJ(PdNNNNNNNNNNNNNNNNNNNNNNE SECTOR CALL DERR1 LDA CMND ;AND THE COMMAND CALL DERR1 LDA STATUS ;AND THE STATUS DERR1: CALL HEX1 ;OUTPUT IT IN HEX * NNNNNNNNNNNNNNNNNNJ.NNNNNNNNNNNNNNNNNNNNNNT ; ; ROUTINE QPARM ALSO SETS CERTAIN DISK PARAMETERS. IN THIS ; CASE, THE DESIRED START TRACK, SIDE, AND SECTOR ARE ; SET.KNNNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNNNHE ERROR CONDITION WAS ENCOUNTERED.) EACH CAUSES ; A UNIQUE MESSAGE TO BE PRINTED, THEN DOES A WARM ; INITIALIZATION OF THE M NNNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNN!D NO PARITY ARE SELECTED. EITHER 2 OR 3 CARRIAGE RETURNS ; MUST BE ENTERED TO ESTABLISH THE CORRECT BAUD RATE. ; I8250: MVi'NNNNNNNNNNNNNNNNNNNJiNNNNNNNNNNNNNNNNNNNNNNRL MOV A,H OUT SINTEN MOV A,L ;SET THE DIVISOR OUT SDATA MVI A,3 ;SET DATA REGISTER ACCESS OUT SLCTRL XRA A ;DISAB% NNNNNNNNNNNNNNNNNNJENNNNNNNNNNNNNNNNNNNNNN;SAVE THE FLAG LXI H,80H SHLD LUNIT ;FORCE A READ ADDRESS COMMAND CALL EXLF ;GET THE START, STOP ADDRESS PUSH D ;SAVE TH NNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNBLE-SIDED ORA A JRZ RW7 ;JUMP IF NOT LDA SIDE ;YES, SEE IF NEXT SIDE OR TRACK NEEDED CPI 0D0H JRNZ RW7 ;NEXT TRACK, JUQINNNNNNNNNNNNNNNNNNJ#NNNNNNNNNNNNNNNNNNNNNNNS 80H-17FH, THEN ; TRANSFERS PROGRAM CONTROL TO LOCATION 80H. ; IT EXPECTS THE DOS LOADER TO BE ON THESE ; TWO SECTORS. ; +NNNNNNNNNNNNNNNNNNJ)cUNNNNNNNNNNNNNNNNNNNNNN JMP PRTWA ;CONTINUE THE MESSAGE ; ; SET DISK PARAMETERS ROUTINE EXPECTS THREE PARAMETERS ; TO BE ENTERED FROM THE CONSOLE. u$NNNNNNNNNNNNNNNNNNJ/NNNNNNNNNNNNNNNNNNNNNN THESE PARAMETERS NEED ONLY BE SET PRIOR TO THE ; FIRST DISK ACCESS, OR WHEN A NON-CONTIGUOUS DISK ACCESS ; IS DESIRED. IF TBNNNNNNNNNNNNNNNNNNJuNNNNNNNNNNNNNNNNNNNNN!ONITOR. THE I/O ERROR ; CAUSES THE I/O ASSIGNMENTS TO BE RESET TO DEFAULT ASSIGNMENTS. ; IOER: XRA A ;SET IOBYTE TO DEFAULT eo!NNNNNNNNNNNNNNNNNNJ FNNNNNNNNNNNNNNNNNNNNN!I A,0FH ;SET UP THE 8250 OUT SMDMCT LXI D,40H ;SET UP TO TIME THE START BIT MOV H,D ;MAKE (H,L)=0 MOV L,D I8250A: IN SMdINNNNNNNNNNNNNNNNNNJ:NNNNNNNNNNNNNNNNNNNNN!LE INTERRUPTS OUT SINTEN OUT SLSTAT ;AND RESET ERROR FLAGS CALL TTYIN ;GET A CHARACTER ANI 7FH ;STRIP OFF ANY PARITY BITD NNNNNNNNNNNNNNNNNNJUNNNNNNNNNNNNNNNNNNNNNNE LIMIT RW1: LDA RWFLG ORA A ;SEE IF READ OR WRITE JRNZ RW2 ;JUMP IF READ SHLD HSTBUF ;SET THE WRITE SOURCE BUF CALL DW4 NNNNNNNNNNNNNNNNNNJWNNNNNNNNNNNNNNNNNNNNNNMP MVI A,90H ;ELSE, SET NEXT SIDE JR RW8 RW7: MVI A,0D0H DCX H ;ELSE, UPDATE THE TRACK INR M INX H RW8: STA SIDE M.NNNNNNNNNNNNNNNNNNJ$ NNNNNNNNNNNNNNNNNNNNNNBOOT: LXI H,0 ;SET UP THE DISK PARMS SHLD DISKNO LXI H,0D001H ;SIDE 0, SECTOR 1 SHLD SECTOR LXI H,TBUF SHLD LUNIT ;FOTNNNNNNNNNNNNNNNNNNNJ*6NNNNNNNNNNNNNNNNNNNNNN THESE PARAMETERS ; ARE: UNIT NUMBER (0-3); SECTORS PER TRACK; ; AND DOUBLE-SIDED SWITCH (0 OR NON-0). ; ONLY THE UNIT NUMBE5V'NNNNNNNNNNNNNNNNNNNJ0ھNNNNNNNNNNNNNNNNNNNNNNHE PARAMETERS ARE NOT RESET BETWEEN ; DISK ACCESSES, THE DATA TRANSFER WILL OCCUR TO/FROM ; THE NEXT LOGICALLY SEQUENTIAL DISK1} NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃl; مxH扵S#_.̒j9זvE㚲Q \,ʣh8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJ*NNNNNNNNNNNNNNNNNNNNN! LOCATIONS. ; QPARM: CALL EXPR3 ;GET THE THREE PARAMETERS MOV H,C ;MOVE OVER THE START SECTOR SHLD TRACK ;STORE THE TRACK NNNNNNNNNNNNNNNNNNJqNNNNNNNNNNNNNNNNNNNNNN ON THE ; CURRENT CONSOLE, EITHER AT THE START OF A NEW ; LINE (EP = LADRA) OR AT THE CURRENT LOCATION (EP ; = LADR). ; LAÃBNNNNNNNNNNNNNNNNNNJ GNNNNNNNNNNNNNNNNNNNNNN' ;OUPTUT A BLANK ; CO: LDA IOBYTE ANI 3 ;ISOLATE CONSOLE ASGT JZ TTYOUT ;TTY DEVICE ACTIVE CPI 2 JM CRTOUT ;CRT ACTIVg NNNNNNNNNNNNNNNNNNNJ;NNNNNNNNNNNNNNNNNNNNNN;CRT ACTIVE JNZ CUSI1 ;USER CONSOLE 1 ACTIVE ; RI: LDA IOBYTE ANI 0CH ;ISOLATE BATCH ASGT JZ TTYRDR ;TTY ACTIVE CPI 8 I6yNNNNNNNNNNNNNNNNNNJQNNNNNNNNNNNNNNNNNNNNNNTHE STRING MUST BE TERMINATED BY BIT 7 SET IN THE ; LAST CHARACTER OF THE STRING. THE STRING WILL START ; A NEW LINE (EP = PR~NNNNNNNNNNNNNNNNNNJVNNNNNNNNNNNNNNNNNNNNN!T A NEW LINE ; IT INCLUDES TWO NULL CHARACTERS FOR TTY TYPE ; DEVICES FOR THE HEAD MOVEMENT TIME. ; CRLF: PUSH H ;SAVE THE C^9NNNNNNNNNNNNNNNNNNJ%NNNNNNNNNNNNNNNNNNNNNNE DATA RET ; TTOST: IN SLSTAT ;GET 8250 LINE STATUS ANI 20H ;ISOLATE TX BUFFER EMPTY BIT RZ ;RETURN IF NOT EMPTY ADI NNNNNNNNNNNNNNNNNNNJ+2NNNNNNNNNNNNNNNNNNNNN! HIGH SPEED PUNCH STATUS PUSO1: EQU IOER ;UNASSIGNED USER PUNCH 1 PUSO2: EQU IOER ;UNASSIGNED USER PUNCH 2 ; ; EQUATES FOR VNNNNNNNNNNNNNNNNNNJyNNNNNNNNNNNNNNNNNNNNN!AND SECTOR MOV A,E ;GET THE SIDE INDICATOR ORA A ;SEE IF SINGLE-SIDED MVI A,0D0H ;SIDE 0 SELECT BITS JRZ QPARM1 ;JUMP IFLpHNNNNNNNNNNNNNNNNNNNJaNNNNNNNNNNNNNNNNNNNNNNDRA: CALL CRLF ;START A NEW LINE LADR: MOV A,H ;GET HIGH TWO DIGITS CALL HEX1 ;PRINT THEM MOV A,L ;GET LOW TWO DIGITS HEX1~rNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNE JNZ CUSO1 ;USER CONSOLE 1 ACTIVE ; LO: LDA IOBYTE ANI 0C0H ;ISOLATE LIST ASGT JZ TTYOUT ;TTY DEVICE ACTIVE CPI 80H NNNNNNNNNNNNNNNNNNJ'NNNNNNNNNNNNNNNNNNNNN! JM PTRIN ;PAPER TAPE READER ACTIVE JZ RUSI1 ;USER READER 1 ACTIVE JMP RUSI2 ;USER READER 2 ACTIVE ; LSTAT: LDA IOBYTE mNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNN!TWD) OR CONTINUE ON THE SAME ; LINE (EP = PRTWA) ; PRTWD: CALL CRLF ;START A NEW LINE PRTWA: PUSH B ;SAVE (B,C) PRTA: MOV CYNNNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNNNONTENTS OF (H,L) CRLFA: LXI H,CRMSG ;ADDRESS OF CR,LF MESSAGE CALL PRTWA ; OUTPUT IT POP H ;RESTORE (H,L) RET ; RSTER:aNNNNNNNNNNNNNNNNNNJ&D[NNNNNNNNNNNNNNNNNNNNNN0BFH ;FLAG THE EMPTY STATE RET ; TTYOUT: CALL TTOST ;GET 8250 LINE STATUS JRZ TTYOUT ;WAIT UNTIL ONE OF THE REGISTERS EMPT)NNNNNNNNNNNNNNNNNNNNJ,NNNNNNNNNNNNNNNNNNNNNNADDITIONAL LIST DEVICES ; LPRT: EQU IOER ;UNASSIGNED LINE PRINTER LPRST: EQU IOER ;UNASSIGNED LINE PRINTER STATUS LUSE1: EQU9NNNNNNNNNNNNNNNNNNJHNNNNNNNNNNNNNNNNNNNNNN SO MVI A,90H ;ELSE, SET THE SIDE 1 CONTROL BIT QPARM1: STA SIDE ;SAVE IT RET ; ; HEXN ROUTINE ; ;THIS ROUTINE ADDS AND 256 BYTES JRNZ WRT1 JR EOJ ; EOJB: MVI B,8 ;BASIS OF RESTORE COMMAND!INNNNNNNNNNNNNNNNNNK̎NNNNNNNNNNNNNNNNNNNNN!ASK RNZ ;DONE IF SEEK ERROR IN DTRCK ;CHECK FOR TRACK 00 RDWRT: ORA A LXI H,40H ;BUILD SECTOR BYTE COUNT JRZ RDWRT0 ;JINNNNNNNNNNNNNNNNNNK#ENNNNNNNNNNNNNNNNNNNNNNOV A,H ;GET THE CUNIT VALUE CMP L ;SEE IF SAME AS LUNIT RZ ;RETURN IF SO IDRD1: MVI C,80H ;SET THE AUTO-WAIT BIT CALL SErNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNT ;SEE IF DRIVE HAS BEEN ACTIVE MOV A,M ;GET THE SELBITS ORA A ;SEE IF SET UP YET JRNZ SU0 ;YES, SKIP INIT CODE ; SETIT: rNNNNNNNNNNNNNNNNNNK$cNNNNNNNNNNNNNNNNNNNNNN;ELSE, SEE IF TRACK ZERO ORA A MOV A,M ;REGET THE SELBITS JRNZ SU1 ANI 0BFH ;INSURE DDEN IS RESET SU1: ORA C ;ADD ON AUNNNNNNNNNNNNNNNNNNNNK*@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK0 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃk; ؅tC≱O덺Y)ǒc3Җp> ښyI枴P \*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN SUBTTL I/O BOARD DEFINITIONS ;**************************************************************************** ; ; I/O PORT BOARNNNNNNNNNNNNNNNNNNNNK8NNNNNNNNNNNNNNNNNNNNNN===================== IOB_BASE EQU 0E0H ;============================================================================ ; 1dNNNNNNNNNNNNNNNNNNK NNNNNNNNNNNNNNNNNNNNNNUT 0 ; |STB|D6 |D5 |D4 |D3 |D2 |D1 |D0 | ; ^ \_________________________/ ; | |__________________ 7 BIT ASCII DATŗNNNNNNNNNNNNNNNNNNKȏNNNNNNNNNNNNNNNNNNNNNN____/ ; | |___________ DART CH A BAUD RATE ; |___________________________ DART CH B BAUD RATE ; ; BAUD RATES: ;0=N/A 4NNNNNNNNNNNNNNNNNNNK'DNNNNNNNNNNNNNNNNNNNNNNB_BASE + 8 ;PORT A IOB_PP0B EQU IOB_PP0A + 1 ;PORT B IOB_PP0C EQU IOB_PP0A + 2 ;PORT C IOB_PPS0 EQU IOB_PP0A + 3 ;STATUS IOB/NNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK%gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK+DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN!D ; USES A BLOCK OF 16 PORTS ON AN EVEN PORT BOUNDARY ; ;*******************************************************************7Y!NNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN; CENTRONICS PRINTER INTERFACE ; IOB_CSTS EQU IOB_BASE + 0 ;STATUS PORT ; ; D7 IN D0 ; |FLT| X | X | X |SEL|PO |AcNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNA ; |_________________________________ DATA STROBE* (0) OUT ; ; BIT #S: IOB_CDST EQU 7 ;DATA STROBE* IOB_CPRM EQU 1 ;PR^` NNNNNNNNNNNNNNNNNNKQNNNNNNNNNNNNNNNNNNNNNN=134.5 8=9600 C=2400 ;1=N/A 5=200 9=4800 D=300 ;2=50 6=600 A=1800 E=150 ;3=75 7=2400 B=1200 F=110 ; ; DART PORTS (SEE ZNNNNNNNNNNNNNNNNNNKrNNNNNNNNNNNNNNNNNNNNNN_PPC0 EQU IOB_PPS0 ;COMMAND ; ; 8255 #1 ; IOB_PP1A EQU IOB_BASE + 0CH ;PORT A IOB_PP1B EQU IOB_PP1A + 1 ;PORT B IOB_PPM8NNNNNNNNNNNNNNNNNNNNK INNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK&2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK,$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN********* ; ; REVISIONS: ; 1.0 - 23 OCT 83 GRH ; SPLIT OFF FROM SYSPARAM.INC ; ADD HEADER GRAPHICS ; ; 1.1 6 JUL 88 GE9NNNNNNNNNNNNNNNNNNK $7NNNNNNNNNNNNNNNNNNNNNNCK|BSY| ; ^ ^ ^ ^ ^_____ BUSY (1) ; | | | |_________ ACKNOWLEGE* (0) ; | | |_____________ PAPER OUz NNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNIME* ;============================================================================ ; ; SPARE PARALLEL PORTS ; ;=====% NNNNNNNNNNNNNNNNNNNKb)NNNNNNNNNNNNNNNNNNNNNNILOG DATA SHEET FOR DEFINITIONS) ; ; CHANNEL A ; IOB_DDTA EQU IOB_BASE + 4 ;DATA IOB_DSTA EQU IOB_DDTA + 1 ;STATUS IOB_D NNNNNNNNNNNNNNNNNNNKA&NNNNNNNNNNNNNNNNNNNNN!1C EQU IOB_PP1A + 2 ;PORT C IOB_PPS1 EQU IOB_PP1A + 3 ;STATUS IOB_PPC1 EQU IOB_PPS1 ;COMMAND NNNNNNNNNNNNNNNNNNNK!xNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNKRkNNNNNNNNNNNNNNNNNNNNNNRH ; Add '?' to all global names. ; ; 1.2 26 SEP 88 GRH ; Change '?' prefixes to 'IOB_' prefixes. ; Shorten names to 8 char0NNNNNNNNNNNNNNNNNNNK qdNNNNNNNNNNNNNNNNNNNNN!T (1) ; | |_________________ SELECT ON (1) ; |_________________________________ FAULT (1) ; ; BIT #S: IOB_CBSY EQUNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN======================================================================= IOB_PP1 EQU IOB_BASE + 1 IOB_PP2 EQU IOB_BASE + 2 9NNNNNNNNNNNNNNNNNNK7zNNNNNNNNNNNNNNNNNNNNNNCMA EQU IOB_DSTA ;COMMAND ; ; CHANNEL B ; IOB_DDTB EQU IOB_DDTA + 2 ;DATA IOB_DSTB EQU IOB_DDTB + 1 ;STATUS IOB_DCMB EX NNNNNNNNNNNNNNNNNNNKرNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK"+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK.FNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNKaZNNNNNNNNNNNNNNNNNNNNNNs. ; ;**************************************************************************** ;===================================== BNNNNNNNNNNNNNNNNNNK BUNNNNNNNNNNNNNNNNNNNNNN 0 ;BUSY IOB_CACK EQU 1 ;ACKNOWLEDGE* IOB_CPAP EQU 2 ;PAPER OUT IOB_CSEL EQU 3 ;SELECT IOB_CFLT EQU 7 ;FAULT ; ;==========NNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN ;============================================================================ ; ; Z-80 'DART' PORTS ; IOB_DBAUD EQU IOB_`MNNNNNNNNNNNNNNNNNNNKKNNNNNNNNNNNNNNNNNNNNNNQU IOB_DSTB ;COMMAND ;============================================================================ ; ; PROGRAMMABLE PORerNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK)"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK/wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK4 NNNNNNNNNNNNNNNNNNNNNN======================================= ; ; BASE ADDRESS OF BOARD ; ;=======================================================>NNNNNNNNNNNNNNNNNNNK NNNNNNNNNNNNNNNNNNNNNN================================================================== ; IOB_COUT EQU IOB_CSTS ;CENTRONICS DATA PORT ; ; 7 Oa< NNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNBASE + 3 ;DART BAUD RATE SELECT PORT ; ; D7 I/O D0 ; |D3 |D2 |D1 |D0 |D3 |D2 |D1 |D0 | ; \_____________/ \_________rNNNNNNNNNNNNNNNNNNKuNNNNNNNNNNNNNNNNNNNNN!TS (8255S) ; ;============================================================================ ; ; 8255 #0 ; IOB_PP0A EQU IO9HNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK$TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK*wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK0:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁl:օr@܉xF⍰~L葶R X&š^,Ȟd2΢j8Ԧ~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL˃NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLa%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLAYNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL+"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLqNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL۽NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL&TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL,9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL B*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL';NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL!eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL'gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL4vNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL yNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLQgNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL"6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL(wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL.[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL $HNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLbVNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL)DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL/jNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLRNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLrhNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL$2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL0'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁg5хm; ׉sAݍyG㑱M長S!Y'Þ_-ɢe3ϦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLVNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLviNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL%6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLF+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL#:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL dNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL&cNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL, NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL uNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL߼NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL!UNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL'PNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL-8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL INNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLfWNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL(@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL.kNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL0wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL xNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLUfNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL#7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL)sNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL/ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLe$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLEXNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL*&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN