home *** CD-ROM | disk | FTP | other *** search
- TITLE COMMAND SUBSYSTEM FOR SYSTEM MONITOR * Release A
- ; *******Donated to the Pascal/Z Users Group,July 1980********
- ; SYSTEM MONITOR COMMAND SUBSYSTEM * Release A
- ; MODULE ONE
- ;
- ; BASE ADDRESSES
- ;
- ;CBASE CONSOLE SUBSYSTEM BASE
- ;TBASE CASSETTE SUBSYSTEM BASE
- ;DBASE DISK SUBSYSTEM BASE
- ;VBASE INTEL I/O VECTOR SUBSYS BASE
- ;WBASE MONITOR WORK SPACE
- ;SBASE MONITOR STACK SPACE
- ;
- ;
- ; LINKAGES TO CONSOLE SUBSYSTEM
- ;
- CINITL DEFL CBASE
- STATUS DEFL CBASE+3
- SKEY DEFL CBASE+6
- UKEY DEFL CBASE+9
- LPOUT DEFL CBASE+0CH
- BUFFIN DEFL CBASE+0FH
- BUILD DEFL CBASE+12H
- VADDR DEFL CBASE+15H
- SVIDEO DEFL CBASE+18H
- PVIDEO DEFL CBASE+1BH
- VIDOUT DEFL CBASE+1EH
- VIDPRO DEFL CBASE+21H
- ;
- ; LINKAGES TO CASSETTE SUBSYSTEM
- ;
- TINITL DEFL TBASE
- ZSAVE DEFL TBASE+3
- ZLOAD DEFL TBASE+6
- SWRITE DEFL TBASE+9
- SREAD DEFL TBASE+0CH
- ;
- ; LINKAGES TO DISK SUBSYSTEM
- ;
- DINITL DEFL DBASE ;INITIALIZE
- DISK1 DEFL DBASE+03 ;MAIN ENTRY POINT
- ;
- ; DEFINE ALL THE INTERNAL SYMBOLS
- ;
- ; ASCII SYMBOLS
- ;
- NULL DEFL 00H
- EOM DEFL 00H
- CLT DEFL 1CH
- CRT DEFL 1EH
- CDN DEFL 1FH
- CUP DEFL 1DH
- HOME DEFL 0BH
- CLEAR DEFL 0CH
- BOTTOM DEFL 03H
- REPT DEFL 12H
- CR DEFL 0DH
- LF DEFL 0AH
- COFF DEFL 0FH
- CON DEFL 0EH
- HTAB DEFL 09H
- ESC DEFL 1BH
- LINS DEFL 04H
- DEL DEFL 7FH
- SPACE DEFL 20H
- MINUS DEFL 2DH
- DOT DEFL 2EH
- QUOTE DEFL 27H
- PAGE DEFL 11H
- SCROLL DEFL 17H
- STX DEFL 01H
- REV DEFL 05H
- DIR DEFL 16H
- PROMP DEFL '>'
- PTGL DEFL 10H
- ;
- ;MONITOR WORK SPACE INDEX ADDRESS LOCATIONS
- ; THE MONITOR OBTAINS THE ADDRESS STORED AT
- ; [WORK] AND LOADS IT INTO THE [IY] REG
- ; THERE AFTER THE MONITOR WILL ACCESS THE WORK
- ; SPACE INDIRECTLY THROUGH THE [IY] REG
- ;
- ; THE WORK SPACE IS DEFINED AS FOLLOWS:
- ; IY-4DH IOBYTE ALLOCATION FLAG
- ; IY-4CH DATA BLOCK TABLE, TEN BLOCKS
- ; K - DELIMITER CHAR
- ; K+1 - LSB BLOCK ADDRESS
- ; K+2 - MSB BLOCK ADDRESS
- ; K+3 - NO OF BYTES IN BLOCK
- ; IY-0CH DECODED ADDRESS ONE
- ; IY-OAH " " TWO
- ; IY-08H " " THREE
- ; IY-06H NUMBER OF ADDRESSES DECODED
- ; IY-05H BLOCK POINTER (BLK NO)
- ; IY-04H NUMBER OF BLOCKS DEBLOCKED IN BUFFER
- ; IY-03H NUMBER OF SIGNIFICANT BYTES IN BUFFER
- ; IY-02H ADDRESS OF FIRST SIGNIFICANT BYTE IN
- ; BUFFER (FIRST NUN-SPACE ASCII CHAR)
- ; IY-00H STARTING POINT OF BUFFER (80H BYTES)
- ;
- ;START OF MONITOR CODE
- ;
- MBASE EQU $
- ;
- ; EXTERNAL ENTRY VECTORS
- ;
- MNTRY0 JP START ;COLD START OF MONITOR
- MNTRY1 JP RESTRT ;WARM START OF MONITOR
- MNTRY2 JP FMEM ;MEMORY TEST
- ;
- ; ADDRESS DEFINITIONS
- ;
- WORK DEFW WBASE
- STACK DEFW SBASE
- ;
- ;
- ; MAIN COMMAND JUMP TABLE
- ;
- MJUMP DEFW ASSIGN ;A
- DEFW LOCKUP ;B
- DEFW COPY ;C
- DEFW DSPLAY ;D
- DEFW ENTER ;E
- DEFW FILL ;F
- DEFW GOTO ;G
- DEFW HEX ;H
- DEFW INPUT ;I
- DEFW JUMP ;J
- DEFW NAVAIL ;K
- DEFW LIST ;L
- DEFW MOVE ;M
- DEFW NAVAIL ;N
- DEFW OUTPUT ;O
- DEFW PROGRM ;P
- DEFW NAVAIL ;Q
- DEFW READ ;R
- DEFW SEARCH ;S
- DEFW TEST ;T
- DEFW NAVAIL ;U
- DEFW VERIFY ;V
- DEFW WRITE ;W
- DEFW NAVAIL ;X
- DEFW NAVAIL ;Y
- DEFW NAVAIL ;Z
- ;
- ; COPY COMMAND JUMP TABLE
- ;
- CJUMP DEFW CPM ;TT
- DEFW CPM ;TD
- DEFW READ ;TM
- DEFW CPM ;TP
- DEFW CPM ;TC
- DEFW CPM ;TU
- DEFW CPM ;DT
- DEFW CPM ;DD
- DEFW CPM ;DM
- DEFW CPM ;DP
- DEFW CPM ;DC
- DEFW CPM ;DU
- DEFW WRITE ;MT
- DEFW CPM ;MD
- DEFW MOVE ;MM
- DEFW LIST ;MP
- DEFW DSPLAY ;MC
- DEFW CPM ;MU
- DEFW CPM ;PT
- DEFW CPM ;PD
- DEFW CPM ;PM
- DEFW CPM ;PP
- DEFW CPM ;PC
- DEFW CPM ;PU
- DEFW CPM ;CT
- DEFW CPM ;CD
- DEFW ENTER ;CM
- DEFW CPM ;CP
- DEFW CPM ;CC
- DEFW CPM ;CU
- DEFW CPM ;UT
- DEFW CPM ;UD
- DEFW CPM ;UM
- DEFW CPM ;UP
- DEFW CPM ;UC
- DEFW CPM ;UU
- ;
- ; VERIFY COMMAND JUMP TABLE
- ;
- VJUMP DEFW CPM ;TT
- DEFW CPM ;TD
- DEFW CPM ;TM
- DEFW CPM ;TU
- DEFW CPM ;DT
- DEFW CPM ;DD
- DEFW CPM ;DM
- DEFW CPM ;DU
- DEFW CPM ;MT
- DEFW CPM ;MD
- DEFW VMOVE ;MM
- DEFW CPM ;MU
- DEFW CPM ;UT
- DEFW CPM ;UD
- DEFW CPM ;UM
- DEFW CPM ;UU
- ;
- ; MAIN ENTRIES INTO THE MONITOR
- ;
- START SUB A
- JP INIT
- ST1 CALL CINITL ;INITIALIZE CONSOLE
- CALL TINITL ;INITIALIZE CASSETTE
- CALL DINITL ;INITIALIZE DISK
- LD A,69H
- LD (IY-4DH),A
- LD HL,SMESS1
- CALL VIDPRO
- JR COMM
- RESTRT LD A,1
- JP INIT
- ST2 LD HL,SMESS2
- CALL VIDPRO
- COMM LD HL,SMESS3
- CALL VIDPRO
- RECOMM CALL BUILD
- LD A,(IY-3);NULL COMMAND FIELD?
- OR A
- JR Z,COMM
- CALL REDUCE
- CALL DBLOCK
- LD A,1
- CALL SETDBA ;SET TO BLOCK 1
- LD A,(IX+3) ;GET BLK SIZE
- OR A
- JP Z,ERR01 ;IF BLK SIZE ZERO
- CALL HLIX ;GET STARTING ADDR OF BLK
- LD A,(HL) ;GET FIRST BYTE OF BLOCK
- JR MVECT
- INIT LD SP,(STACK)
- LD IY,(WORK)
- OR A
- JP Z,ST1
- JP ST2
- ;
- ; MAIN VECTOR ROUTINE
- ; A REG CONTAINS ALPHA
- ;
- MVECT SUB 'A'
- JP C,ERR01
- CP 26
- JP NC,ERR01
- LD HL,MJUMP
- ADD A,A
- ADD A,L
- LD L,A
- JR NC,VECTOR
- INC H
- VECTOR LD E,(HL)
- INC HL
- LD D,(HL)
- EX DE,HL
- JP (HL)
- ;
- ; COPY AND VERIFY VECTOR
- ; SOURCE BYTE IN D REG
- ; DEST BYTE IN E REG
- ; UPON ENTRY AND EXIT
- ;
- COPY CALL GETSD
- JP C,ERR02
- JP Z,MOVE
- JR CVECT
- VERIFY CALL GETSD
- JP C,ERR02
- JP Z,VMOVE
- JR VVECT
- GETSD CALL GETOPT
- RET C
- LD D,(HL)
- INC HL
- LD E,(HL)
- CP SPACE
- RET
- SCF
- RET
- CVECT LD HL,CJUMP
- SUB A
- PUSH AF
- PUSH DE
- PUSH HL
- LD HL,CTBLE
- LD BC,6
- JR CVJUMP
- VVECT LD HL,VJUMP
- LD A,01
- PUSH AF
- PUSH DE
- PUSH HL
- LD HL,VTBLE
- LD BC,4
- LD A,01H
- CVJUMP PUSH BC
- PUSH HL
- LD A,E
- CPIR
- JR NZ,CV1
- LD E,C
- POP HL
- POP BC
- PUSH BC
- LD A,D
- CPIR
- JR NZ,CV1+1
- POP HL
- ADD HL,HL
- LD B,C
- CALL CV2
- LD C,A
- LD B,E
- LD L,2
- CALL CV2
- ADD A,C
- LD C,A
- POP HL
- ADD HL,BC
- POP BC
- POP AF
- JP VECTOR
- CV1 POP HL
- POP HL
- POP HL
- POP HL
- POP HL
- JP ERR02
- CV2 SUB A
- INC B
- JR CV4
- CV3 ADD A,L
- CV4 DJNZ CV3
- RET
- ;
- ; REDUCE LOW CASE ALPHA TO CAPS AND MASK OFF
- ; MSB OF BYTE TO OVERRIDE REVERSE VIDEO
- ;
- REDUCE LD L,(IY-2)
- LD H,(IY-1)
- LD A,(IY-3)
- OR A
- RET Z
- LD B,A
- RED1 LD A,(HL)
- AND 7FH
- CP 61H
- JR C,RED2
- CP 0FBH
- JR NC,RED2
- SUB 20H
- RED2 LD (HL),A
- INC HL
- DJNZ RED1
- RET
- ;
- ; DEBLOCKING ROUTINE ... THIS ROUTINE DETERMINES THE
- ; STARTING ADDRESS OF EACH SIGNIFICANT BLOCK DEFINED
- ; BY THE DELIMITERS [^.,;:-+*/=] WHERE ^ IS A BLANK
- ;
- DBLOCK LD A,1
- CALL SETDBA
- LD L,(IY-02H)
- LD H,(IY-01H)
- CALL IXHL
- LD (IX),NULL
- LD A,(IY-3) ;LD NO OF BYTES IN BUFFER
- LD B,A
- OR A
- JR Z,DB3+1
- LD DE,1 ;LOAD COUNTERS
- DB1 LD C,(HL)
- LD A,C
- CALL DELCK
- JR NZ,DB2
- LD (IX+3),D
- LD A,10
- SUB E
- JR Z,DB3
- LD D,00H
- LD (IX+4),C
- INC E
- INC HL
- LD (IX+5),L
- LD (IX+6),H
- CALL INCDBA
- JR DB2A
- DB2 INC D
- INC HL
- DB2A DJNZ DB1
- LD (IX+3),D
- DB3 LD A,E
- LD (IY-04H),A
- RET
- ;
- ; CHECK BUFFER BYTE FOR DELIMITER.
- ;
- DELCK PUSH HL
- PUSH BC
- LD HL,DELCHR
- LD BC,10
- CPIR
- POP BC
- POP HL
- RET
- ;
- ; GET OPTION IF THERE IS ANY
- ; CARRY SET - ERROR STATE .. EOF
- ; ZERO SET - OPTION FOUND
- ; ZERO CLR - NO OPTION
- ;
- GETOPT LD A,(IY-04H)
- CP 2
- RET C
- LD A,(IX+4)
- CP DOT
- JR NZ,GET1
- CALL INCDBA
- CALL HLIX
- LD A,(HL)
- JR GET2
- GET1 LD A,SPACE
- GET2 OR A
- RET
- ;
- ; DECODE THE ADDRESSES ON THE BUFFER
- ; Error state is flagged by carry-flag-set.
- ; Up to three addresses are decoded. These are
- ; saved in ADDR1,ADDR2,and ADDR3. Number
- ; of addresses decoded is saved in NADDR.
- ; Expected format:
- ; [ ADDR1-ADDR2-ADDR3]
- ;
- GETADD CALL INCDBA
- LD A,00H
- RET C ;IF ZERO BLOCKS
- LD (IY-06H),A
- LD A,(IX)
- CP SPACE
- JR NZ,GA2 ;FIRST DELIMITER NOT A SPACE
- CALL DCDAD2
- RET C ;IF DECODING ERR
- LD (IY-0CH),E ;SAVE ADDR 1
- LD (IY-0BH),D
- LD A,1
- LD (IY-06H),A
- CALL NXADD ;GET NEXT ADDR
- RET C ;IF DECODING ERR
- JR NZ,GA1 ;IF NO MORE ADDR
- LD (IY-0AH),E
- LD (IY-09H),D
- LD A,2
- LD (IY-06H),A
- CALL NXADD ;GET NEXT ADDR
- RET C ;IF ERR
- JR NZ,GA1 ;IF NO MORE ADDR
- LD (IY-08H),E
- LD (IY-07H),D
- LD A,3
- LD (IY-06H),A
- GA1 OR A
- RET
- GA2 SCF
- RET
- ;
- NXADD CALL INCDBA ;INC TO NEXT BLK
- JR NC,NXA1
- NXA0 SUB A
- INC A
- RET
- NXA1 LD A,(IX) ;GET DELIMITER
- CP MINUS ;MUST HAVE A - DELIM
- JR NZ,NXA0
- CALL DCDAD1
- RET C ;IF ERR
- SUB A
- RET
- INCDBA INC IX
- INC IX
- INC IX
- INC IX
- LD A,(IY-05H)
- INC A
- LD (IY-05H),A
- IDBA1 PUSH BC
- LD C,A
- LD A,(IY-04H)
- SUB C
- POP BC
- RET
- CKBLK LD A,(IY-05H)
- JR IDBA1
- ;
- SETDBA PUSH IY
- POP BC
- LD IX,0FFB4H
- ADD IX,BC
- LD (IY-05H),A
- DEC A
- ADD A,A
- ADD A,A
- LD C,A
- LD B,0
- ADD IX,BC
- RET
- ;
- ; LOAD HL WITH (IX+1)
- ;
- HLIX LD L,(IX+1)
- LD H,(IX+2)
- RET
- ;
- ; LOAD (IX+1) WITH HL
- ;
- IXHL LD (IX+1),L
- LD (IX+2),H
- RET
- ;
- ; LOAD ADDRESSES INTO HL
- ;
- HLAD1 LD L,(IY-0CH)
- LD H,(IY-0BH)
- RET
- HLAD2 LD L,(IY-0AH)
- LD H,(IY-09H)
- RET
- HLAD3 LD L,(IY-08H)
- LD H,(IY-07H)
- RET
- ;
- ; DECODE ADDRESSES FROM HEX
- ;
- DCDAD1 LD DE,0FFFFH
- JR DCD1
- DCDAD2 LD DE,0000H
- DCD1 LD A,(IX+3)
- OR A
- JR NZ,DCD2
- SUB A
- RET
- DCD2 LD DE,0
- CALL HLIX
- LD B,A
- ;
- DHADD EX DE,HL
- LD HL,0
- DHA1 ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- LD A,(DE)
- CALL VHEX
- JR C,DHA2
- ADD A,L
- LD L,A
- INC DE
- DJNZ DHA1
- DHA2 EX DE,HL
- RET
- ;
- ; VERIFY HEX CHARACTER
- ;
- VHEX SUB '0'
- RET C
- CP 0AH
- JR NC,VHX1
- CCF
- RET
- VHX1 SUB 7
- CP 0AH
- RET C
- CP 10H
- CCF
- RET
- ;
- ; ESCAPE KEY CHECK
- ;
- ESCAPE CALL UKEY
- CP ESC
- JR Z,ESCP1
- OR A
- RET
- ESCP1 SCF
- RET
- ;
- ; GET TWO ADDRESSES, CALC NO. OF BYTES,
- ; PUT NO. BYTES IN REG DE, STARTING ADD IN REG HL
- ; ERROR RETURNS: CARRY-SET - HEXIDEC ERROR
- ; ZERO - REV ADD
- ;
- GET2AD CALL GETADD
- JR C,GERR
- LD A,(IY-06H)
- CP 2
- JR C,GERR
- CALCAD CALL HLAD1
- EX DE,HL
- CALL HLAD2
- SBC HL,DE
- JR C,CLC1
- EX DE,HL
- INC DE
- RET
- CLC1 POP HL
- JP ERR04
- GERR POP HL
- JP ERR03
- ;
- ; UPDATE COUNTERS HL AND DE AND TEST DE FOR ZERO
- ;
- UPDATE INC HL
- DEC DE
- LD A,D
- OR E
- RET
- ;
- ; OUTPUT 8 HEX BYTES
- ; ...CARRY SET IF MORE BYTES ON QUEY
- ;
- OUT8HB LD B,8
- PUSH BC
- LD A,(HL)
- CALL OUTHBT
- CALL OUTSPC
- POP BC
- CALL UPDATE
- RET Z
- DJNZ OUT8HB+2
- SCF
- RET
- ;
- ; OUTPUT 8 ASCII BYTES, CNTL CHARACTERS
- ; ARE OUTPUTTED AS PERIODS
- ;
- OUT8AB LD B,8
- LD C,(HL)
- CALL BTASC
- CALL VIDOUT
- CALL UPDATE
- RET Z
- DJNZ OUT8AB+2
- SCF
- RET
- ;
- ; CONVERT BYTE TO HEX CHARACTERS
- ; EXPECT BYTE TO BE IN A REG
- ; RESULT IS IN C AND A REG
- ; C - MOST SIG NYBBLE
- ; A - LEAST SIG NYBBLE
- ;
- BTHEX PUSH AF
- AND 0F0H
- RRCA
- RRCA
- RRCA
- RRCA
- CALL BT1
- LD C,A
- POP AF
- AND 0FH
- BT1 ADD A,90H
- DAA
- ADC A,40H
- DAA
- RET
- ;
- ; CONVERT ASCII CONTROL CHARACTERS TO PERIODS
- ;
- BTASC LD A,C
- AND 7FH
- CP 20H
- JR C,BTA1
- CP DEL
- JR Z,BTA1
- CP 5FH
- JR Z,BTA1
- RET
- BTA1 CP 80H
- JR NC,BTA2
- LD C,'.'
- RET
- BTA2 LD C,'.'+80H
- RET
- ;OUTPUT HEX ADDR RESIDING IN HL REG
- ;
- OUTHAD LD A,H
- CALL OUTHBT
- LD A,L
- OUTHBT CALL BTHEX
- PUSH AF
- CALL VIDOUT
- POP AF
- LD C,A
- OUTB JP VIDOUT
- ;
- ; OUTPUT [.],[-],[ ],[CRLF],[CRLF>],[ ]
- ;
- OUTDOT LD C,'.'
- JR OUTB
- OUTSPC LD C,' '
- JR OUTB
- OUTDSH LD C,'-'
- JR OUTB
- OUTEXP LD C,'!'
- JR OUTB
- CRLF LD C,CR
- CALL VIDOUT
- LD C,LF
- JR OUTB
- CRLFP CALL CRLF
- LD C,PROMP
- JR OUTB
- OUT3SP CALL OUTSPC
- CALL VIDOUT
- JP VIDOUT
- DEFB NULL
-