home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG036.ARK
/
MBMBOT.ASC
< prev
next >
Wrap
Text File
|
1984-04-29
|
15KB
|
440 lines
.TITLE "Initialization, bootstrap relocation,"
.SBTTL "and multi-bank memory management program."
.REMARK `
Memory bank management program designed for
a multi-bank memory system equipped with an
IMSAI VIOC video board and an IMSAI MIO I/O
board specially wired to turn memory on the
VIOC board on and off. This program initia-
lizes the computer and moves a bootstrap
routine from a Cromemco 16-KPR ROM board in
Bank 0 to an Industrial Micro Systems 32K
RAM board in Bank 1. This bootstrap, then,
boots in the CPM disk operating system from
disk drive 0 to Bank 1 RAM memory. Console
Status, STATUS (CONST); Console Input, KYBD
(CONIN); Console Output, VIOC (CONOT) and
Printer Output/Control, PRINT (LIST) sub-
routines called by CPM's BIOS are also in-
cluded in this program. A RUBOUT routine
handles onscreen character deletion for the
CPM and BASIC language environments (back-
slashes generated by most BASICs to set off
deleted blocks are supressed) and an ESCAPE
routine provides large letter (ESC L) and
inverse video (ESC V) switches for the VIOC
vidoe board.
COMPILED BY LEONARD GOGOL ON 8-13-1979.
(Use TDL Z80 Relocating/Linking Assembler.)`
.IDENT MBMBOT
.INTERN .MAIN.
.PREL
.LINK
.MAIN. = 8000H
;
; PROGRAM DATA TABLES.
;
;I/O EQUATES.
ACBIT = 8 ;ACK CHARACTER READY BIT.
CDATA = 2 ;CONSOLE DATA PORT.
CKBR = 2 ;KEYBOARD READY BIT.
CSTAT = 3 ;CONSOLE STATUS PORT.
LDATA = 1 ;PRINTER DATA PORT.
LRBIT = 1 ;PRINTER READY BIT.
LSTAT = 3 ;PRINTER STATUS PORT.
CHARC = 7 ;PRINTER CHARACTER COUNT.
BUFFC = 30 ;PRINTER BUFFER COUNT.
FRPN = 0FFH ;FRONT PANEL I/O PORT.
DCOM = 0F8H ;TARBELL
DDATA = 0FBH ;DISK
DSTAT = 0F8H ;CONTROLLER
SECT = 0FAH ;PORT
WAIT = 0FCH ;ASSIGNMENTS.
;IOFLAG BUFFER, FLAGS.
RUBFL = 7 ;RUBOUT FLAG.
BSLFL = 6 ;BACKSLASH FLAG.
BOLFL = 5 ;BEGINNING OF LINE FLAG.
ESCFL = 4 ;ESCAPE FLAG.
;RESERVED MEMORY AREA.
STACK = 0E3FFH;STACK LOCATION IN BANK 0.
BEGSCR = 0E000H;SCRATCH AND STACK
ENDSCR = 0EFFFH;SPACE IN BANK 0.
SPSAVE = 0F63CH;SP STORAGE IN BANK 1.
;DEFINED ADDRESSES.
CLEAR = 0F800H;VIOC INITIALIZATION ROUTINE.
VIOC = 0F803H;VIOC CHAR. OUTPUT ROUTINE.
;SELECTIVE BANK-ON SWITCHES.
B0A = 4 ;0000-3FFF ROM BANK 0.
B0B = 2 ;4000-7FFF ROM BANK 0.
B0C = 1 ;8000-BFFF ROM BANK 0.
B0D = 8 ;C000-DFFF ROM BANK 0.
B0E = 16 ;E000-EFFF RAM BANK 0.
B0FON = 0 ;F000-FFFF VIOC BANK 0.
BXA = 1 ;0000-0FFF RAM BANK 1A,
;8000-8FFF RAM BANK 1B.
BXB = 2 ;1000-1FFF RAM BANK 1A,
;9000-9FFF RAM BANK 1B.
BXC = 4 ;2000-2FFF RAM BANK 1A,
;A000-AFFF RAM BANK 1B.
BXD = 8 ;3000-3FFF RAM BANK 1A,
;B000-BFFF RAM BANK 1B.
BXE = 16 ;4000-4FFF RAM BANK 1A,
;C000-CFFF RAM BANK 1B.
BXF = 32 ;5000-5FFF RAM BANK 1A,
;D000-DFFF RAM BANK 1B.
BXG = 64 ;6000-6FFF RAM BANK 1A,
;E000-EFFF RAM BANK 1B.
BXH = 128 ;7000-7FFF RAM BANK 1A,
;F000-FFFF RAM BANK 1B.
BXI = 3 ;0000-1FFF RAM BANK 1A,
;8000-9FFF RAM BANK 1B.
BXJ = 0CH ;2000-3FFF RAM BANK 1A,
;A000-BFFF RAM BANK 1B.
BXK = 30H ;4000-5FFF RAM BANK 1A,
;C000-DFFF RAM BANK 1B.
BXL = 0C0H ;6000-7FFF RAM BANK 1A,
;E000-FFFF RAM BANK 1B.
BXM = 0FH ;0000-3FFF RAM BANK 1A,
;8000-BFFF RAM BANK 1B.
BXN = 0F0H ;4000-7FFF RAM BANK 1A,
;C000-FFFF RAM BANK 1B.
BXO = 0FFH ;0000-7FFF RAM BANK 1A,
;8000-FFFF RAM BANK 1B.
;BANK-OFF SWITCHES.
BKOFF = 0 ;ALL BANKS EXCEPT VIOC.
B0FOFF = 1 ;F000-FFFF VIOC OFF.
;BANK SELECT PORTS.
B0PA = 40H ;BANK 0A (0000-EFFF).
B0PB = 2 ;BANK 0B (F000-FFFF VIOC).
B1PA = 41H ;BANK 1A (0000-7FFF).
B1PB = 51H ;BANK 1B (8000-FFFF).
B2PA = 42H ;BANK 2A (0000-7FFF).
B2PB = 52H ;BANK 2B (8000-7FFF).
;
; JUMP TABLE.
;
.LOC .MAIN.
JMP START ;START OF MBMBOT.
JMP STATUS ;STATUS ROUTINE.
JMP KYBD ;KEYBORD. INPUT ROUTN.
JMP VIDEO ;CONSOLE OUTPUT ROUTN.
JMP PRINT ;PRINTER OUTPUT ROUTN.
;
;INITIALIZATION AND BOOTSTRAP ROUTINES.
;
.LOC .MAIN.+30H
;INITIALIZE TU-ART.
START: MVI A,01 ;RESET TU-ART
OUT 62H
OUT 72H
MVI A,00 ;TURN OFF INTRRUPTS.
OUT 63H
OUT 73H
MVI A,0C0H ;SET BAUD RATE TO 9600.
OUT 60H
OUT 70H
;CLEAR EC00-EFFF IN BANK 0 SCRATCH RAM.
LXI B,ENDSCR-BEGSCR ;# BYTES TO CLEAR.
LXI H,BEGSCR ;STARTING ADDRESS.
LXI D,BEGSCR+1 ;+1.
XRA A ;CLEAR WITH ZEROS.
MOV M,A ;CLEAR FIRST BYTE.
LDIR ;DO THE REST!
;INIT. STACK, CALL VIOC INIT. ROUTINE
;& SET UP VIOC FOR UPPER & LOWER CASE.
LXI SP,STACK ;SET STACK POINTER.
CALL CLEAR ;VIOC INIT. ROUTINE.
MVI A,1BH ;SET UP
CALL VIOC ;VIOC
MVI A,55H ;FOR UPPER AND
CALL VIOC ;LOWER CASE.
;MANAGE MEMORY.
MVI A,B0C ;TURN OFF
OUT B0PA ;RAM AT SCRATCH.
;MOVE BOOT.
LXI B,EBOOT-SBOOT ;#OF BYTES TO MOVE.
LXI H,RBOOT ;STARTING AT RBOOT.
LXI D,SBOOT ;TO SBOOT.
LDIR ;DO IT!
JMP SBOOT ;RUN BOOTSTRAP.
RBOOT:
.LOC 3000H ;DESTINATION OF BOOT.
;CPM BOOTSTRAP LOADER.
;MANAGE MEMORY.
SBOOT: MVI A,BKOFF ;TURN OFF ROM
OUT B0PA ;AT 8000-BFFF.
MVI A,B0FOFF ;TURN OFF
OUT B0PB ;VIOC.
MVI A,BXO ;TURN ON RAM
OUT B1PB ;AT 8000-FFFF.
;BOOT CPM.
IN WAIT ;WAIT FOR HOME.
XRA A ;SET
MOV L,A ;L=0,
MOV H,A ;H=0,
INR A ;A=1,
OUT SECT ;SECTOR=1.
MVI A,8CH ;SEND COMMAND TO
OUT DCOM ;READ SECTOR TO 1771.
RLOOP: IN WAIT ;WAIT FOR DRQ OR INTRQ.
ORA A ;SET FLAGS.
JP RDONE ;DONE IF INTRQ.
IN DDATA ;READ DATA.
MOV M,A ;PUT INTO MEMORY.
INX H ;INCREMENT MEM POINTER.
JMP RLOOP ;READ ANOTHER BYTE.
RDONE: IN DSTAT ;READ DISK STATUS.
ORA A ;SET FLAGS.
JZ 0 ;GO TO CPM LOADER IF 0.
HLT ;HALT IF ERROR.
EBOOT:
;
;CP/M BIOS SUBROUTINES CALLED FROM BANK 1.
;
.LOC RBOOT+EBOOT-3000H ;PLACE IN ROM.
;STATUS TEST ROUTINE.
STATUS: IN CSTAT ;READ CONSOLE STATUS.
ANI CKBR ;LOOK AT KB READY BIT.
MVI A,0 ;SET A=0 FOR RETURN.
RZ ;NOT READY WHEN LOW.
IN LSTAT ;READ NEC ACK STATUS.
ANI ACBIT ;LOOK AT ACK READY BIT.
MVI A,0 ;SET A=0 FOR RETURN.
RNZ ;NOT READY WHEN HIGH.
CMA ;IF READY, A=0FFH.
RET ;RETURN FROM STAT. TST.
;KEYBOARD INPUT ROUTINE.
;MANAGE STACK POINTERS AND MEMORY.
KYBD: CALL IN ;INBOUND HOUSEKEEPING.
;LOOP UNTIL INPUT FROM KEYBD. OR PRNTR.
;MANAGE RUB AND BEG. OF LINE FLAGS.
;IVERT VIDEO IF ESC V, SET VIOC TO
;LARGE LETTERS IF ESC L.
KYBD1: IN CSTAT ;READ CONSOLE STATUS.
ANI CKBR ;IF NOT READY,
JZ NEC ;TRY NEC.
IN CDATA ;READ A CHARACTER.
ANI 7FH ;MAKE MOST SIG. BIT=0.
PUSH H ;SAVE H&L REGISTERS.
LXI H,IOFLAG ;POINT TO IOFLAG.
CPI 1BH ;IS IT AN ESCAPE?
JZ KYBD4 ;IF SO,-->KB4.
BIT ESCFL,M ;TEST IF ESC FLAG SET.
JZ KYBD5 ;IF NOT,-->KB5. IF SO,
ANI 0DFH ;LOWER TO UPPER CASE.
CPI 56H ;IS IT A 'V'?
JNZ KYBD2 ;IF NOT,-->KB2.
MVI A,1BH ;IF SO, LOAD ESC.
CALL VIOC ;SEND IT OUT.
MVI A,56H ;LOAD 'V'.
CALL VIOC ;SEND IT OUT.
MVI A,0DH ;LOAD CR.
JMP KYBD3 ;GO ON.
KYBD2: CPI 4CH ;IS IT A 'L'?
JNZ KYBD3 ;IF NOT,-->KB3.
MVI A,1BH ;IF SO, LOAD ESC.
CALL VIOC ;SEND IT OUT.
MVI A,4CH ;LOAD 'L'.
CALL VIOC ;SEND IT OUT.
MVI A,1BH ;LOAD ESC.
CALL VIOC ;SEND IT OUT.
MVI A,43H ;LOAD 'C'.
CALL VIOC ;SEND IT OUT.
MVI A,0DH ;LOAD CR.
KYBD3: RES ESCFL,M ;RESET ESC FLAG.
JMP KYBD5 ;GO ON.
KYBD4: SET ESCFL,M ;SET ESC FLAG.
KYBD5: CPI 7FH ;IS IT A RUB?
JNZ KYBD7 ;RETURN IF NOT.
BIT BOLFL,M ;TEST BOL FLAG.
JNZ KYBD6 ;IF SET,-->KB6.
SET BOLFL,M ;IF NOT, SET BOL
SET RUBFL,M ;AND RUB FLAG.
JMP KYBD7 ;RETURN.
KYBD6: RES RUBFL,M ;RESET RUB FLAG.
KYBD7: POP H ;RESTORE H&L REGS.
JMP RETURN ;RETURN FROM TYPE.
NEC: IN LSTAT ;READ NEC ACK STATUS.
ANI ACBIT ;IF ACK NOT READY,
JZ KYBD1 ;TRY KYBD.
IN LDATA ;INPUT NEC.
ANI 7FH ;MAKE MOST SIG. BIT=0.
;SAVE CHARACTER. MANAGE MEMORY AND
;STACK POINTER. RETURN WITH
;CHARACTER IN A REGISTER.
RETURN: MOV C,A ;SAVE CHAR. IN C REG.
CALL OUT ;OUTBOUND HOUSEKEEPING.
MOV A,C ;RESTORE CHAR. TO A.
RET ;RETURN TO RAM.
;VIDEO OUTPUT ROUTINE.
;MANAGE STACK POINTERS AND MEMORY.
VIDEO: CALL IN ;INBOUND HOUSEKEEPING.
;OUTPUT CHARACTER.
CALL BACKSP ;CALL BKSP. & VIDEO.
CALL FROPA ;ECHO AT PANEL.
;MANAGE MEMORY AND STACK POINTER.
CALL OUT ;OUTBOUND HOUSEKEEPING.
RET ;RETURN TO BANK 1 RAM.
;BACKSPACE AND VIDEO OUTPUT ROUTINES.
BACKSP: PUSH H ;SAVE H&L REGS.
LXI H,IOFLAG ;POINT TO FLAG BUFFER.
BIT RUBFL,M ;TEST RUB FLAG.
MOV A,C ;GET CHARACTER.
JNZ BKSP1 ;IF RUB FLG SET-->BS1.
BIT BSLFL,M ;IF NOT, TEST BSL FLAG.
JZ BKSP4 ;NOT SET, OUTPUT CHAR.
RES BSLFL,M ;IF SET, RESET BSL
RES BOLFL,M ;AND BOL FLAGS.
POP H ;RESTORE H&L REGS.
RET ;RETURN FROM BACKSP.
BKSP1: CPI 5CH ;IS CHARACTER A BSL?
JNZ BKSP2 ;IF NOT, -->BS2.
SET BSLFL,M ;IF SO, SET BSL FLAG
RES BOLFL,M ;AND RESET BOL FLAG.
POP H ;RESTORE H&L REGS.
RET ;RETURN FROM BACKSP.
BKSP2: CPI 7FH ;IS CHARACTER A RUB?
JNZ BKSP3 ;IF NOT, -->BS3.
POP H ;IF YES, DROP IT, RST
RET ;H&L REGISTERS AND RET.
BKSP3: MVI A,8 ;BACKSPACE,
CALL VIOC
MVI A,20H ;SPACE
CALL VIOC
MVI A,8 ;AND BACKSPACE AGAIN.
BKSP4: CALL VIOC ;OUTPUT CHARACTER.
RES RUBFL,M ;RESET RUB
RES BOLFL,M ;AND BOL FLAGS.
POP H ;RESTORE H&L REGS.
RET ;RETURN FROM BACKSP.
;FRONT PANEL PROGRAMMED OUTPUT LIGHTS
;DRIVER ROUTINE.
FROPA: CMA ;INVERT BYTE.
OUT FRPN ;ECHO AT FRONT PANEL.
RET ;RETURN FROM FROPA.
;PRINTER OUTPUT ROUTINE.
;MANAGE STACK POINTERS AND MEMORY.
PRINT: CALL IN ;INBOUND HOUSEKEEPING.
;NEC SPINWRITER 1200 BAUD PRINT PROG.
IN LSTAT ;READ PRINTER STATUS.
ANI LRBIT ;LOOK AT READY BIT.
JZ PRINT ;LOOP TILL HIGH.
PUSH H ;SAVE H&L.
LDA CCOUNT ;GET CHARACTER COUNT.
CPI CHARC ;7 CHARACTERS YET?
JC PRINT2 ;NOPE--PRINT ONE.
MVI A,03 ;CTL. C TO A REGISTER,
OUT LDATA ;SEND IT TO PRINTER.
XRA A ;ZERO IN A REGISTER AND
STA CCOUNT ;IN CHARACTER COUNTER.
LXI H,BCOUNT ;LOCATION OF BUFFER.
INR M ;INCREMENT IT!
PRINT1: LDA BCOUNT ;GET COUNT FROM BUFFER.
CPI BUFFC ;IS IT 30 YET?
JC PRINT2 ;IF NOT, THEN PRINT.
IN LSTAT ;READ PRINTER ACK STAT.
ANI ACBIT ;LOOK AT ACK READY BIT.
JZ PRINT1 ;LOOP TILL HIGH.
IN LDATA ;READ INPUT.
ANI 7FH ;MASK FOR ASCII.
CPI 06 ;IS IT A CTL. F?
JC PRINT1 ;IF NOT, TRY AGAIN.
DCR M ;IF YES, DECR. BCOUNT.
PRINT2: LDA CCOUNT ;GET CHARACTER COUNT.
INR A ;INCREMENT IT AND
STA CCOUNT ;PUT IT BACK.
MOV A,C ;GET DATA.
CPI 03 ;IS IT A CTL.C?
JC PRINT3 ;RETURN IF IT IS.
OUT LDATA ;OTHERWISE, PRINT IT!!!
CALL FROPA ;DISPLAY AT PANEL.
POP H ;RESTORE H&L.
;MANAGE MEMORY AND STACK POINTER.
PRINT3: CALL OUT ;OUTBOUND HOUSEKEEPING.
RET ;RETURN TO BANK 1 RAM.
;
; ENTRY AND EXIT HOUSEKEEPING ROUTINES.
;
IN: POP H ;RET. ADDRESS IN H&L.
SSPD SPSAVE ;SAVE BANK 1 SP.
MVI A,BKOFF ;TURN OFF RAM AT
OUT B1PB ;E000-FFFF IN BANK 1.
MVI A,B0C+B0D+B0E ;TURN ON BANK 0
OUT B0PA ;SCRATCH RAM.
LXI SP,STACK ;INIT. BANK 0 SP.
MVI A,B0FON ;TURN ON.
OUT B0PB ;VIOC.
PUSH H ;RET. ADDRESS ON STACK.
RET ;RETURN TO CALLER.
OUT: POP H ;RET. ADDRESS IN H&L.
MVI A,B0FOFF ;TURN OFF
OUT B0PB ;VIOC
MVI A,B0C+B0D ;AND BANK 0
OUT B0PA ;SCRATCH RAM.
MVI A,BXL ;TURN ON RAM AT
OUT B1PB ;E000-FFFF IN BANK 1.
LSPD SPSAVE ;RESTORE BANK 1 SP.
PUSH H ;RET. ADDRESS ON STACK.
RET ;RETURN TO CALLER.
;
; RESERVED AREA IN BANK 0 SCRATCH RAM.
;
.LOC 0EFFDH
IOFLAG: .BLKB 1 ;RUB, BSL, BOL, ESC FL.
BCOUNT: .BLKB 1 ;CHARACTER COUNTERS FOR
CCOUNT: .BLKB 1 ;1200 BAUD I/O DRIVER.
.END .MAIN.