B>makro cbios512.bb7 MAKRO ASSEMBLER AMA.3 0000 ; CP/M 2.2 DOUBLE DENSITY SYSTEM 0000 ; ----512---- BYTE SECTORS 0000 ; CBIOS I/O DRIVERS FOR 56K SYSTEM ON DISCUS 2D 0000 ; ---- DISK BUFFERS IN RAM (FC00-FFFF) 0000 ; ---- CHANGED PRINTER DRIVER FOR EPSON 0000 ; 0000 ; VERSION 2 - MOSLVLx FUNCTIONS IMBEDDED IN CBIOS 0000 ; 0038 MSIZE EQU 56 ;MEMORY SIZE IN K 0000 ; 9000 BIAS EQU (MSIZE-20)*1024 0000 ; 1C03 AMOUNT EQU 1C03H ;#DBL DEN SECTORS TO LOAD E7FF STACK EQU 0E7FFH ;AREA FOR WARM BOOT STACK 0000 ; 0000 ; BUFFERS IN RAM FC00 BUF1 EQU 0FC00H FE00 BUF2 EQU 0FE00H 0000 ; C400 CPM EQU BIAS+3400H ;CP/M CCP ENTRY POINT CC06 ENTRY EQU BIAS+3C06H ;CP/M ENTRY POINT 0004 CDISK EQU 4 ;CURRENT DISK LOCATION 0003 IOBYT EQU 3 ;CPM IO BYTE 0000 ; E000 ORIGIN EQU 0E000H ;DJ 2D CONTROLLER ROM E009 TKZERO EQU ORIGIN+9 ;SEEK TRK ZERO E015 DREAD EQU ORIGIN+21 ;DISK READ ROUTINE E018 DWRIT EQU ORIGIN+24 ;DISK WRITE ROUTINE E02D SETDEN EQU ORIGIN+2DH ;SET DENSITY 0000 ; 0000 ; INSTEAD OF CALLS TO SET TRACK, SECT, ETC. STORE THE 0000 ; VALUES DIRECTLY INTO DJ RAM AREA E6F9 ADJTRK EQU ORIGIN+6F9H E6F8 ADJSEC EQU ORIGIN+6F8H E6E7 ADJDMA EQU ORIGIN+6E7H E6EB ADJDRV EQU ORIGIN+6EBH 0000 ; 0000 PRTS EQU 0 ;PRINTER STATUS PORT 0000 PRTD EQU 0 ;PRINTER DATA PORT 0000 PARST EQU 0 ;KEYBOARD STATUS 0001 PARDA EQU 1 ;KEYBOARD DATA 0002 SERS EQU 2 ;SERIAL STATUS 0003 SERD EQU 3 ;SERIAL DATA 0004 VIOXS EQU 4 ;VIO-X STATUS PORT 0005 VIOXD EQU 5 ;VIO-X DATA PORT 00FF SENSE EQU 255 ;SENSE SWITCHES 001A CLEAR EQU 01AH 0042 LINPGE EQU 66 ;NUMBER OF LINES PER PAGE 0000 ; 0000 ; THIS JUMP TABLE MUST NOT BE ALTERED 0000 ORG CPM+1600H DA00 C3E6DB START JMP BOOTJ ;JUMP TO COLD BOOT DA03 C386DB JMP WBOOT ;WARM BOOT DA06 C335DA JMP CONST ;CONSOLE STATUS DA09 C36FDA JMP CONIN ;CONSLE INPUT DA0C C398DA JMP CONOUT ;CONSOLE OUTPUT DA0F C3B8DA JMP PRINT ;PRINTER OUTPUT DA12 C3B5DA PUNCH JMP PUNCR ;PUNCH OUTPUT DA15 C3B2DA READER JMP READR ;READER INPUT MAKRO ASSEMBLER AMA.3 DA18 C3BADB JMP RESTOR ;TRACK ZERO HOME DA1B C3C1DB JMP SELDSK ;SELECT DRIVE DA1E C3E9DB JMP SETTRK ;TRACK SEEK DA21 C3EEDB JMP SETSEC ;SET SECTOR DA24 C3F6DB JMP SETDMA ;SET DMA ADDRESS DA27 C306DC JMP READ ;DISK READ DA2A C325DC JMP WRITE ;DISK WRITE DA2D C335DB JMP LISTST ;IS PRINTER READY DA30 C3FFDB JMP SECTRAN ;SKEW THE SECTORS DA33 ; DA33 00 STATSV DB 0 ;DISK ERROR TYPE DA34 00 LINCNT DB 0 DA35 ; DA35 ; CONST-CHECK FOR DATA AVAILABLE FROM CONSOLE DEVICE DA35 ; ON RETURN A=0 NO DATA, A=FF DATA AVAILABLE DA35 3A6EDA CONST LDA ICFLG ;IS PREV READ CHAR AVAILABLE? DA38 A7 ANA A DA39 C0 RNZ ;YES DA3A E5 PUSH H ;DUMMY UP RETURN ADDR DA3B 2158DA LXI H,STRET ;TO FAKE CALL FOR JUMPS DA3E E3 XTHL DA3F 3A0300 LDA IOBYT ;GET IO BYTE DA42 E603 ANI 3 ;BITS OF INTEREST DA44 FE00 CPI 0 ;0=TTY, 3P+S SER PORT DA46 CA71DB JZ TTYST DA49 FE01 CPI 1 ;1=CRT:, KEYBOARD (3P+S PAR) DA4B CA68DB JZ KEYST DA4E FE02 CPI 2 ;2=BAT, MODEM/KEYBOARD COMBO DA50 CA62DA JZ REMCC DA53 FE03 CPI 3 ;3=UC1, KEYBOARD (3P+S PAR) DA55 CA68DB JZ KEYST DA58 C8 STRET RZ ;NO CHAR AVAILABLE DA59 326DDA REMSTX STA ICBUF ;SAVE CHAR READ DA5C 3EFF MVI A,255 ;CHAR AVAIL INDICATOR DA5E 326EDA STA ICFLG DA61 C9 RET DA62 ; STATUS CHECK FOR 'REMOTE' DA62 CD68DB REMCC CALL KEYST ;SEE IF DATA FROM KEYBD DA65 20F2 JRNZ REMSTX ;YES, SAVE THE CHAR DA67 CD7ADB CALL MDMST ;SEE IF DAT FROM MODEM LINE DA6A 20ED JRNZ REMSTX DA6C C9 RET DA6D ; DA6D 00 ICBUF DB 0 ;SAVED INPUT CHAR DA6E 00 ICFLG DB 0 ;0=NO CHAR, FF=CHAR SAVED DA6F ; DA6F ; CONIN - GET DATA FROM CONSOLE DEVICE, WAIT FOR IT DA6F 3A6EDA CONIN LDA ICFLG DA72 A7 ANA A DA73 280A JRZ DOCONI DA75 2F CMA DA76 326EDA STA ICFLG DA79 3A6DDA LDA ICBUF DA7C E67F ANI 7FH ;TURN OFF PARITY DA7E C9 RET DA7F 3A0300 DOCONI LDA IOBYT ;GET IO BYTE DA82 E603 ANI 3 ;BITS OF INTEREST DA84 FE00 CPI 0 ;0=TTY (3P+S) DA86 CAD5DA JZ TTYIN DA89 FE02 CPI 2 ;2=BAT, REMOTE (MDM, KEYBD) MAKRO ASSEMBLER AMA.3 DA8B CA91DA JZ DORMTI ;YES DA8E C3CDDA JMP KEYIN ;1=CRT, 3=UC1 (KEYBOARD) DA91 ; DA91 CD62DA DORMTI CALL REMCC ;MODEM STATUS ROUTINE DA94 28FB JRZ DORMTI ;NOTHING READY, WAIT DA96 18D7 JR CONIN ;IF READY, RETURN CHARACTER DA98 ; DA98 ; CONOUT - DISPLAY DATA ON CONSOLE DEVICE, DATA IN REG C DA98 3A0300 CONOUT LDA IOBYT DA9B E603 ANI 3 DA9D FE00 CPI 0 ;0=TTY 3P+S SERIAL DA9F CA51DB JZ TTYOT DAA2 FE01 CPI 1 ;1=CRT (VIOX) DAA4 CAE3DA JZ VIOOUT DAA7 FE03 CPI 3 ;3=UC1 (LINE PRINTER) DAA9 CAECDA JZ LPOUT DAAC CDE3DA CALL VIOOUT ;2=BAT (VIOX AND MODEM) DAAF C35ADB JMP MDMOT DAB2 ; DAB2 ; TAPE READER INPUT DAB2 ; NOTE, IOBYT IGNORED FOR READER AND PUNCH, GOES TO MODEM DAB2 C3DDDA READR JMP MDMIN DAB5 ; DAB5 ; TAPE PUNCH (OUTPUT), JUST PASS THRU DAB5 C35ADB PUNCR JMP MDMOT DAB8 ; DAB8 ; LINE PRINTER ROUTINE DAB8 ; IOBYT DEFINITIONS DAB8 ; TTY 00 - GOES TO 3P+S SERIAL DAB8 ; CRT 01 - GOES TO VIOX DAB8 ; LPT 10 - GOES TO LINE PRINTER DAB8 ; UL1 11 - PAGING LINE PRINT DRIVER DAB8 3A0300 PRINT LDA IOBYT DABB E6C0 ANI 0C0H ;JUST GET BITS OF INTEREST DABD FEC0 CPI 0C0H DABF CAECDA JZ LPOUT ;UL1 (11) DAC2 A7 ANA A DAC3 CA51DB JZ TTYOT ;TTY (00) DAC6 07 RLC DAC7 DA03DB JC PRTCH ;LPT (10) DACA C3E3DA JMP VIOOUT ;CRT (01) DACD ; DACD ; READ A CHAR FROM KEYBOARD DACD DB00 KEYIN IN PARST DACF 0F RRC DAD0 38FB JRC KEYIN DAD2 DB01 IN PARDA DAD4 C9 RET DAD5 ; READ A CHAR FROM TTY DAD5 DB02 TTYIN IN SERS DAD7 0F RRC DAD8 38FB JRC TTYIN DADA DB03 IN SERD DADC C9 RET DADD ; DADD ; GET A CHAR FROM MODEM (DJ SERIAL PORT) DADD CD7ADB MDMIN CALL MDMST DAE0 28FB JRZ MDMIN DAE2 C9 RET DAE3 ; MAKRO ASSEMBLER AMA.3 DAE3 ; OUTPUT CHAR TO VIO-X DAE3 DB04 VIOOUT IN VIOXS DAE5 07 RLC DAE6 30FB JRNC VIOOUT DAE8 79 MOV A,C DAE9 D305 OUT VIOXD DAEB C9 RET DAEC ; SEND A CHAR TO PRINTER DAEC ; COUNT LINES SO CAN SIMULATE FORM FEED (0CH) DAEC 79 LPOUT MOV A,C DAED FE0C CPI 12 ;IS THIS A FORM FEED DAEF 2826 JRZ DOFF ;YES DAF1 FE0A CPI 10 ;IS THIS A LINE FEED DAF3 200E JRNZ PRTCH ;NO DAF5 3A34DA LDA LINCNT ;YES-COUNT NEW LINE DAF8 3C INR A DAF9 FE42 CPI LINPGE ;AT TOP OF PAGE DAFB 2001 JRNZ NOT66 DAFD AF XRA A ;RESET LINE COUNT DAFE 3234DA NOT66 STA LINCNT DB01 0E0A MVI C,10 ;OUTPUT A LF DB03 DB00 PRTCH IN PRTS DB05 E640 ANI 40H ;PRINTER READY? DB07 20FA JRNZ PRTCH DB09 79 MOV A,C ;GET DATA DB0A F680 ORI 80H ;FLIP DB0C D300 OUT PRTD ;MUST GENERATE CHAR AVAIL DB0E E67F ANI 7FH ;IN MSB DB10 D300 OUT PRTD DB12 F680 ORI 80H DB14 D300 OUT PRTD DB16 C9 RET DB17 ; SIMUALTE A FORM FEED DB17 E5 DOFF PUSH H DB18 2134DA LXI H,LINCNT DB1B AF XRA A DB1C BE CMP M ;AT TOP OF FORM NOW? DB1D 2811 JRZ ENDFF ;YES, IGNORE FF DB1F 0E0D FFLP MVI C,13 ;DO A CAR RET DB21 CD03DB CALL PRTCH DB24 0E0A MVI C,10 ;DO A LINE FEED DB26 CD03DB CALL PRTCH DB29 34 INR M DB2A 3E42 MVI A,LINPGE DB2C BE CMP M DB2D 20F0 JRNZ FFLP DB2F AF XRA A DB30 77 ENDFF MOV M,A DB31 E1 POP H DB32 0E0C MVI C,12 ;RESTORE FF IN B REG DB34 C9 RET DB35 ; IS PRINTER READY DB35 ; RETURN A=0 IF PRTR NOT READY, A=FF IF READY DB35 ; FOR WORDSTAR: CY=1 IF BUSY, CY=0 IF READY DB35 3A0300 LISTST LDA IOBYT DB38 07 RLC DB39 380D JRC PRTST ;CHECK LINE PRINTER (LPT, UL1) DB3B 07 RLC DB3C 3F CMC ;CRT (VIOX) IS ALWAYS READY DB3D 3E00 MVI A,0 MAKRO ASSEMBLER AMA.3 DB3F D0 RNC DB40 ; IS TTY (3P+S) READY TO RECEIVE DB40 DB02 TTYOST IN SERS DB42 07 RLC DB43 3E00 MVI A,0 DB45 D8 RC DB46 2F CMA DB47 C9 RET DB48 ; IS LINE PRINTER READY TO RECEIVE DB48 DB00 PRTST IN PRTS ;GET PRINTER STATUS DB4A 07 RLC DB4B 07 RLC DB4C 3E00 MVI A,0 DB4E D8 RC DB4F 2F CMA DB50 C9 RET DB51 ; DB51 ; OUTPUT CHAR TO TTY DB51 DB02 TTYOT IN SERS DB53 07 RLC DB54 38FB JRC TTYOT DB56 79 MOV A,C DB57 D303 OUT SERD DB59 C9 RET DB5A ; DB5A 3AF9E3 MDMOT LDA 0E3F9H ;DJ UART OUTPUT DB5D E608 ANI 8 DB5F 20F9 JRNZ MDMOT DB61 79 MOV A,C ;DATA CHARACTER DB62 2F CMA DB63 32F8E3 STA 0E3F8H DB66 2F CMA DB67 C9 RET DB68 ; DB68 ; CHAR AVAIL FROM KEYBD? DB68 DB00 KEYST IN PARST ;KEYBOARD CHAR AVAIL DB6A 2F CMA DB6B E601 ANI 1 DB6D C8 RZ DB6E DB01 IN PARDA DB70 C9 RET DB71 ; DB71 ; CHAR AVAIL FROM TTY (3P+S) DB71 DB02 TTYST IN SERS DB73 2F CMA DB74 E601 ANI 1 DB76 C8 RZ DB77 DB03 IN SERD DB79 C9 RET DB7A ; DB7A ; CHAR AVAIL FROM DJ (MODEM)? DB7A 3AF9E3 MDMST LDA 0E3F9H ;DJ UART STATUS DB7D 2F CMA DB7E E604 ANI 4 DB80 C8 RZ DB81 3AF8E3 LDA 0E3F8H ;GET THE DATA CHAR DB84 2F CMA DB85 C9 RET DB86 ; DB86 ; WARM BOOT - LOAD CP/M EXCEPT FOR CBIOS MAKRO ASSEMBLER AMA.3 DB86 31FFE7 WBOOT LXI SP,STACK DB89 AF XRA A ;SELECT DRIVE A DB8A 32EBE6 STA ADJDRV ;'SELECT' DRIVE DB8D 01031C LXI B,AMOUNT ;SEC COUNT AND BEGINING SEC DB90 CD0AE7 CALL ORIGIN+70AH ;COLD START LOADER DB93 ; DB93 018000 LXI B,80H ;SETUP DEFAULT DISK BUFFER DB96 CDF6DB CALL SETDMA DB99 3EC3 MVI A,0C3H ;PUT JMP TO WARM BOOT AT 0 DB9B 320000 STA 0 ;WARM BOOT JUMP DB9E 320500 STA 5 ;BDOS JUMP AT 5 DBA1 2103DA LXI H,START+3 DBA4 220100 SHLD 1 DBA7 2106CC LXI H,ENTRY DBAA 220600 SHLD 6 ;PUT JUMP TO CPM AT 6 DBAD 324EDD STA BUF1DRV ;PLUG 'C3' IN DRIVE DBB0 3255DD STA BUF2DRV DBB3 3A0400 LDA CDISK ;JMP TO CPM WITH CURRENT DISK IN C DBB6 4F MOV C,A DBB7 C303C4 JMP CPM+3 ;CPM+3 WON'T EXEC AUTO CMD DBBA ; DBBA ; RESTORE HEAD TO TRACK 0 DBBA ; DON'T LET APPLICATION REALLY RESTORE (PERFORMANCE) DBBA 3A40DD RESTOR LDA IODRV DBBD 32EBE6 STA ADJDRV ;'SELECT' DRIVE DBC0 C9 RET DBC1 ; DBC1 ; SELECT DRIVE IN REG C, RETURN DPH IN HL OR DBC1 ; 0 IF INVALID DBC1 79 SELDSK MOV A,C DBC2 210000 LXI H,0 DBC5 FE02 CPI 2 ;ONLY DRIVES 0,1 ARE VALID DBC7 D0 RNC DBC8 3240DD STA IODRV DBCB 87 ADD A ;X2 DBCC 87 ADD A ;X4 DBCD 87 ADD A ;X8 DBCE 87 ADD A ;X16 DBCF 6F MOV L,A DBD0 115BDD LXI D,DPH1 DBD3 19 DAD D ;POINT TO DPH DBD4 EB XCHG DBD5 210A00 LXI H,10 DBD8 19 DAD D ;POINT TO DPB ADDR DBD9 4E MOV C,M DBDA 23 INX H DBDB 46 MOV B,M DBDC 210F00 LXI H,15 ;GET DENSITY FIELD DBDF 09 DAD B DBE0 7E MOV A,M ;GET DENSITY DBE1 3243DD STA IODEN DBE4 EB XCHG DBE5 C9 RET DBE6 ; DBE6 C3F1DD BOOTJ JMP BOOT DBE9 ; DBE9 ; SETTRK: SET TRACK DBE9 79 SETTRK MOV A,C ;GET TRACK NO. DBEA 3241DD STA IOTRK DBED C9 RET MAKRO ASSEMBLER AMA.3 DBEE ; DBEE ; SET SECTOR DBEE 79 SETSEC MOV A,C DBEF 3246DD STA IOSEC DBF2 3242DD STA IOPSEC DBF5 C9 RET DBF6 ; DBF6 ; SET DMA ADDRESS DBF6 60 SETDMA MOV H,B DBF7 69 MOV L,C DBF8 2247DD SHLD IODMA DBFB 2244DD SHLD IOPDMA DBFE C9 RET DBFF ; DBFF ; SKEW SECTOR NUMBER DBFF 0600 SECTRAN MVI B,0 DC01 EB XCHG DC02 09 DAD B DC03 6E MOV L,M DC04 60 MOV H,B DC05 C9 RET DC06 ; DC06 ; LOGICAL READ, MAY REQUIRE DEBLOCKING IF DBL DNSTY DC06 3A43DD READ LDA IODEN ;GET DENSITY DC09 A7 ANA A DC0A 285D JRZ PHYSRD DC0C CD86DC CALL CALCSEC ;DBL, GET REL SECTOR NO DC0F CDA0DC CALL GETBUF ;GET BUFFER FOR INPUT DC12 D8 RC DC13 C469DC CNZ PHYSRD ;FILL BUFFER IF NEEDED DC16 D8 RC ;RETURN IF INPUT ERROR DC17 CD09DD CALL CALCAD ;ADDR OF REC WITHIN BUF DC1A ED5B47DD LDED IODMA DC1E 018000 LXI B,128 ;LENGTH TO MOVE DC21 EDB0 LDIR DC23 AF XRA A ;SHOW NO ERRORS DC24 C9 RET DC25 ; DC25 ; LOGICAL WRITE, MUST BLOCK IF DBL DENSITY DC25 ; CHANGE-DO WRITE WHEN REQUIRED, NOT REQUESTED DC25 79 WRITE MOV A,C DC26 324BDD STA WRTFLG ;SAVE CPM WRITE FLAG DC29 3A43DD LDA IODEN ;IS IT SNGL DENSITY DC2C A7 ANA A DC2D 2835 JRZ PHYSWT ;YES, DO REAL IO DC2F CD86DC CALL CALCSEC DC32 CDA0DC CALL GETBUF DC35 D8 RC DC36 36FF MVI M,255 ;SAY BUFFER MODIFIED DC38 2809 JRZ NOPRERD ;BUFF ALREADY IN MEMORY DC3A 3A4BDD LDA WRTFLG ;GET CPM WRITE FLAG DC3D FE02 CPI 2 ;WRITE INTO NEW BLOCK DC3F C469DC CNZ PHYSRD ;NO-MUST PRIME BUFFER DC42 D8 RC ;RETURN IF ERROR DC43 CD09DD NOPRERD CALL CALCAD DC46 EB XCHG DC47 2A47DD LHLD IODMA DC4A 018000 LXI B,128 ;LENGTH TO MOVE DC4D EDB0 LDIR DC4F 3A4BDD LDA WRTFLG ;GET CPM WRITE FLAG MAKRO ASSEMBLER AMA.3 DC52 FE01 CPI 1 ;WRITE TO DIRECTORY? DC54 2802 JRZ DOWRIT ;YES, THEN REALLY WRITE DC56 AF XRA A ;FAKE A GOOD WRITE DC57 C9 RET DC58 214DDD DOWRIT LXI H,BUF1MOD ;BEFORE DC5B CD30DD CALL FLSHBF ;FLUSH BUF1 DC5E 2154DD LXI H,BUF2MOD DC61 C330DD JMP FLSHBF ;CALL/RET, FLUSH BUF2 DC64 ; DC64 ; PHYSICAL WRITE REQUEST DC64 2118E0 PHYSWT LXI H,DWRIT DC67 1803 JR RDWR DC69 ; DC69 ; PHYSICAL DISK READ ROUTINE DC69 2115E0 PHYSRD LXI H,DREAD DC6C 2279DC RDWR SHLD RW+1 DC6F 2140DD LXI H,IODRV DC72 CD12DD RDWR1 CALL IOSETU ;DO SELECT, SEEK, SETSEC, ETC DC75 060A MVI B,10 ;RETRY COUNT DC77 C5 RDWRL PUSH B DC78 CD0000 RW CALL 0 ;ADDR PLUGGED IN DC7B C1 POP B DC7C 3006 JRNC RWOK DC7E 10F7 DJNZ RDWRL ;DECR RETRY COUNT DC80 3233DA STA STATSV DC83 C9 RET DC84 AF RWOK XRA A DC85 C9 RET DC86 ; DC86 ; CALCSEC: CONVERT DD SEC INTO PHYS SEC NO AND REC NO DC86 3A46DD CALCSEC LDA IOSEC DC89 C603 ADI 3 ;ADJUST FOR CALC DC8B 47 MOV B,A ;SAVE SEC NO DC8C A7 ANA A DC8D 1F RAR DC8E A7 ANA A DC8F 1F RAR DC90 3242DD STA IOPSEC DC93 3E03 MVI A,3 DC95 A0 ANA B DC96 0F RRC DC97 0F RRC DC98 6F MOV L,A DC99 2600 MVI H,0 DC9B 29 DAD H DC9C 2249DD SHLD IOREC DC9F C9 RET DCA0 ; DCA0 ; ALLOC A BUFFER FOR IO DCA0 214EDD GETBUF LXI H,BUF1DRV DCA3 CDFCDC CALL COMP3 ;REC WANTED IN BUF1 DCA6 283F JRZ USE1 ;YES DCA8 2155DD LXI H,BUF2DRV DCAB CDFCDC CALL COMP3 ;REC IN BUF2 DCAE 2826 JRZ USE2 ;YES DCB0 214EDD LXI H,BUF1DRV DCB3 0602 MVI B,2 DCB5 CDFEDC CALL COMP DCB8 2824 JRZ USE11 DCBA 2155DD LXI H,BUF2DRV MAKRO ASSEMBLER AMA.3 DCBD 0602 MVI B,2 DCBF CDFEDC CALL COMP DCC2 2809 JRZ USE21 DCC4 214CDD LXI H,BUFSW DCC7 3EFF MVI A,0FFH ;ALLOC ALTERNATE BUFFERS DCC9 AE XRA M DCCA 77 MOV M,A DCCB 2811 JRZ USE11 DCCD 2154DD USE21 LXI H,BUF2MOD DCD0 CD30DD CALL FLSHBF ;FLUSH BUFFER IF NECESSARY DCD3 D8 RC ;DISK ERROR DCD4 F601 ORI 1 ;SET NZ FLAG DCD6 2100FE USE2 LXI H,BUF2 ;BUF HAS REC IN IT DCD9 1155DD LXI D,BUF2DRV DCDC 180F JR GBSET DCDE 214DDD USE11 LXI H,BUF1MOD DCE1 CD30DD CALL FLSHBF ;FLUSH CURRENT BUFFER IF REQUIRE D DCE4 D8 RC ;DISK ERROR DCE5 F601 ORI 1 ;FORCE NON ZERO DCE7 2100FC USE1 LXI H,BUF1 ;BUF1 HAS REC IN IT DCEA 114EDD LXI D,BUF1DRV DCED D5 GBSET PUSH D DCEE 2244DD SHLD IOPDMA DCF1 2140DD LXI H,IODRV DCF4 010400 LXI B,4 DCF7 EDB0 LDIR DCF9 E1 POP H DCFA 2B DCX H ;POINT HL TO MOD FLAG DCFB C9 RET DCFC ; COMP3 DCFC 0603 COMP3 MVI B,3 ;LENGTH OF CMPARE DCFE 1140DD COMP LXI D,IODRV DD01 1A COMPLP LDAX D DD02 BE CMP M DD03 C0 RNZ DD04 23 INX H DD05 13 INX D DD06 10F9 DJNZ COMPLP DD08 C9 RET DD09 ; DD09 ED5B49DD CALCAD LDED IOREC DD0D 2A44DD LHLD IOPDMA DD10 19 DAD D DD11 C9 RET DD12 ; DD12 ; IOSETU(P): THIS ROUTINE PERFORMS SELECT, SET TRACK, ETC DD12 ; ENTRY: HL POINT TO PARAMETERS DD12 7E IOSETU MOV A,M ;DRIVE DD13 32EBE6 STA ADJDRV DD16 23 INX H DD17 7E MOV A,M ;TRACK DD18 32F9E6 STA ADJTRK DD1B 23 INX H DD1C 7E MOV A,M ;SECTOR DD1D 32F8E6 STA ADJSEC DD20 23 INX H DD21 4E MOV C,M ;DENSITY DD22 E5 PUSH H DD23 CD2DE0 CALL SETDEN DD26 E1 POP H MAKRO ASSEMBLER AMA.3 DD27 23 INX H DD28 4E MOV C,M ;DMA ADDRESS DD29 23 INX H DD2A 46 MOV B,M DD2B ED43E7E6 SBCD ADJDMA DD2F C9 RET DD30 ; DD30 ; FLSHBF: IF A MODIFIED BLOCK IS IN BUFFER, WRITES IT TO DISK DD30 ; ENTRY: HL POINTS TO BUFXMOD DD30 7E FLSHBF MOV A,M ;GET MODIFIED FLAG DD31 A7 ANA A DD32 C8 RZ DD33 AF XRA A DD34 77 MOV M,A ;SAY NOT MODIFIED DD35 23 INX H ;BUMP TO REC LOCATION ON DISK DD36 1118E0 LXI D,DWRIT DD39 ED5379DC SDED RW+1 ;PLUG WRITE ADDRESS INTO PHYSXX DD3D C372DC JMP RDWR1 ;CALL/RET DD40 ; DD40 00 IODRV DS 1 DD41 00 IOTRK DS 1 DD42 00 IOPSEC DS 1 DD43 00 IODEN DS 1 DD44 0100 IOPDMA DS 2 DD46 00 IOSEC DS 1 DD47 0100 IODMA DS 2 DD49 00 IOREC DS 1 DD4A 00 DB 0 ;MAKE IOREC A WORD DD4B 00 WRTFLG DB 0 ;CPM WRITE TYPE FLAG DD4C FF BUFSW DB 255 DD4D 00 BUF1MOD DB 0 DD4E FF BUF1DRV DB -1 DD4F 00 BUF1TRK DS 1 DD50 00 BUF1SEC DS 1 DD51 00 BUF1DEN DS 1 DD52 00FC BUF1DMA DW BUF1 DD54 00 BUF2MOD DB 0 DD55 FF BUF2DRV DB -1 DD56 00 BUF2TRK DS 1 DD57 00 BUF2SEC DS 1 DD58 00 BUF2DEN DS 1 DD59 00FE BUF2DMA DW BUF2 DD5B ; DD5B ; DISK PARAMETER BLOCKS AND OTHER INFORMATION DD5B ; DD5B ; FOR DBL DEN VERSION BRING A UP DD, B UP SD DD5B B5DD DPH1 DW DDXLT ;DOUBLE DEN SKEW TABLE DD5D 00000000 DW 0,0,0 0000 DD63 79DE DW DIRBUF DD65 8BDD DW DDDPB ;DOUBLE DEN DISK PARM BLOCK DD67 35DE DW CSV1 ;16 BYTE SCRATCH AREA DD69 55DE DW ALV1 ;32 BYTE ALLOC MAP DD6B B5DD DPH2 DW DDXLT ;SINGLE DEN SKEW TABLE DD6D 00000000 DW 0,0,0 0000 DD73 79DE DW DIRBUF DD75 8BDD DW DDDPB ;SINGLE DEN DISK PARM BLOCK DD77 F1DD DW CSV2 DD79 11DE DW ALV2 MAKRO ASSEMBLER AMA.3 DD7B ; DD7B ; SINGLE DENSITY DISK PARAMETER BLOCK DD7B 1A00 SDDPB DW 26 DD7D 030700 DB 3,7,0 DD80 F2003F00 DW 242,63,0C0H,16,2 C0001000 0200 DD8A 00 DB 0 ;MY FIELD, DENSITY DD8B 3C00 DDDPB DW 60 DD8D 040F00 DB 4,15,0 DD90 18017F00 DW 280,127,0C0H,32,2 C0002000 0200 DD9A 01 DB 1 ;MY FIELD, DENSITY DD9B ; DD9B 01070D13 SDXLT DB 1,7,13,19,25,5,11,17,23,3,9,15,21 19050B11 1703090F 15 DDA8 02080E14 DB 2,8,14,20,26,6,12,18,24,4,10,16,22 1A060C12 18040A10 16 DDB5 01020304 DDXLT DB 1,2,3,4,13,14,15,16 0D0E0F10 DDBD 191A1B1C DB 25,26,27,28,37,38,39,40 25262728 DDC5 31323334 DB 49,50,51,52,5,6,7,8 05060708 DDCD 11121314 DB 17,18,19,20,29,30,31,32 1D1E1F20 DDD5 292A2B2C DB 41,42,43,44,53,54,55,56 35363738 DDDD 090A0B0C DB 9,10,11,12,21,22,23,24 15161718 DDE5 21222324 DB 33,34,35,36,45,46,47,48 2D2E2F30 DDED 393A3B3C DB 57,58,59,60 DDF1 ; DDF1 1F00 CSV2 DS 32 DE11 2300 ALV2 DS 36 DE35 1F00 CSV1 DS 32 DE55 2300 ALV1 DS 36 DE79 7F00 DIRBUF DS 128 DEF9 ZZZ2 DS 0 DEF9 ORG CSV2 DDF1 ; DDF1 ; OVERLAY CODE ONLY USED AT COLD START WITH DS'S DDF1 ; DDF1 ; COLD START - CP/M HAS BEEN LOADED BY BOOTSTRAP ROUTINE DDF1 ; INIT STORAGE LOCS AND DISPLAY GREETING DDF1 31FFE7 BOOT LXI SP,STACK DDF4 AF XRA A ;SELECT DRIVE A DDF5 320400 STA CDISK DDF8 ; DDF8 ; START UP INITIALIZATION DDF8 DBFF IN SENSE ;LOW OR HIGH SPEED ON TTY PORT DDFA E680 ANI 80H DDFC 3EF2 MVI A,0F2H ;SET UP FOR HIGH SPEED DDFE FA03DE JM SUART MAKRO ASSEMBLER AMA.3 DE01 3EF6 MVI A,0F6H ; SET UP FOR LOW SPEED DE03 D302 SUART OUT SERS DE05 DB01 IN PARDA ;CLEAR KEYBOARD DE07 3E81 MVI A,81H ;DEFAULT CPM IO BYTE SETTING DE09 ; DEFAULT IO BYTE SETTINGS DE09 ; 10XX XXXX LIST DEVICE - LPT DE09 ; XX00 XXXX PUNCH - TTY (MODEM) DE09 ; XXXX 00XX READER - TTY (MODEM) DE09 ; XXXX XX01 CONSOLE - CRT DE09 320300 STA IOBYT DE0C 2186DB LXI H,WBOOT ;CHANGE COLD START ADDR DE0F 22E7DB SHLD BOOTJ+1 ;TO WARM START ALSO DE12 ; DE12 214BDE LXI H,PROMPT DE15 CD3FDE CALL MESSG ;PRINT SIGNON MSG DE18 018000 LXI B,80H ;SETUP DEFAULT DISK BUFFER DE1B CDF6DB CALL SETDMA DE1E 3EC3 MVI A,0C3H ;PUT JMP TO WARM BOOT AT 0 DE20 320000 STA 0 ;WARM BOOT JUMP DE23 320500 STA 5 ;BDOS JUMP AT 5 DE26 2103DA LXI H,START+3 DE29 220100 SHLD 1 DE2C 2106CC LXI H,ENTRY DE2F 220600 SHLD 6 ;PUT JUMP TO CPM AT 6 DE32 324EDD STA BUF1DRV ;PLUG 'C3' IN DRIVE DE35 3255DD STA BUF2DRV DE38 ; DE38 3A0400 LDA CDISK ;JMP TO CPM WITH CURRENT DISK IN C DE3B 4F MOV C,A DE3C C300C4 JMP CPM DE3F ; DE3F ; MESSG: PRINT MSG POINTED TO BY HL DE3F 7E MESSG MOV A,M DE40 A7 ANA A ;TEST FOR END DE41 C8 RZ DE42 E5 PUSH H DE43 4F MOV C,A DE44 CD98DA CALL CONOUT ;CONSOLE OUTPUT DE47 E1 POP H DE48 23 INX H ;NEXT CHAR DE49 18F4 JR MESSG DE4B ; DE4B ; GREETING MESSAGE DE4B 1B380D PROMPT DB 27,'8',13 ;CLEAR 25th LINE DE4E 1A DB 26 ;CLEAR SCREEN DE4F 43502F4D DB 'CP/M Vers 2.2 (' 20566572 7320322E 322028 DE5E 3536 PSIZE DB '56' DE60 4B29 DB 'K)' DE62 0D0A DB 13,10 DE64 00 DB 0 ;STOPPER DE65 ZZZ1 DS 0 0000 ERRORS SYMBOL TABLE ADJDMA E6E7 00 ADJDRV E6EB 00 ADJSEC E6F8 00 ADJTRK E6F9 00 MAKRO ASSEMBLER AMA.3 ALV1 DE55 01 ALV2 DE11 01 AMOUNT 1C03 00 BIAS 9000 00 BOOT DDF1 01 BOOTJ DBE6 01 BUF1 FC00 00 BUF1DEN DD51 01 BUF1DMA DD52 01 BUF1DRV DD4E 01 BUF1MOD DD4D 01 BUF1SEC DD50 01 BUF1TRK DD4F 01 BUF2 FE00 00 BUF2DEN DD58 01 BUF2DMA DD59 01 BUF2DRV DD55 01 BUF2MOD DD54 01 BUF2SEC DD57 01 BUF2TRK DD56 01 BUFSW DD4C 01 CALCAD DD09 01 CALCSEC DC86 01 CDISK 0004 00 CLEAR 001A 00 COMP DCFE 01 COMP3 DCFC 01 COMPLP DD01 01 CONIN DA6F 01 CONOUT DA98 01 CONST DA35 01 CPM C400 00 CSV1 DE35 01 CSV2 DDF1 01 DDDPB DD8B 01 DDXLT DDB5 01 DIRBUF DE79 01 DOCONI DA7F 01 DOFF DB17 01 DORMTI DA91 01 DOWRIT DC58 01 DPH1 DD5B 01 DPH2 DD6B 01 DREAD E015 00 DWRIT E018 00 ENDFF DB30 01 ENTRY CC06 00 FFLP DB1F 01 FLSHBF DD30 01 GBSET DCED 01 GETBUF DCA0 01 ICBUF DA6D 01 ICFLG DA6E 01 IOBYT 0003 00 IODEN DD43 01 IODMA DD47 01 IODRV DD40 01 IOPDMA DD44 01 IOPSEC DD42 01 IOREC DD49 01 IOSEC DD46 01 IOSETU DD12 01 IOTRK DD41 01 KEYIN DACD 01 KEYST DB68 01 LINCNT DA34 01 LINPGE 0042 00 LISTST DB35 01 LPOUT DAEC 01 MDMIN DADD 01 MDMOT DB5A 01 MDMST DB7A 01 MESSG DE3F 01 MSIZE 0038 00 NOPRERD DC43 01 NOT66 DAFE 01 ORIGIN E000 00 PARDA 0001 00 PARST 0000 00 PHYSRD DC69 01 PHYSWT DC64 01 PRINT DAB8 01 PROMPT DE4B 01 PRTCH DB03 01 PRTD 0000 00 PRTS 0000 00 PRTST DB48 01 PSIZE DE5E 01 PUNCH DA12 01 PUNCR DAB5 01 RDWR DC6C 01 RDWR1 DC72 01 RDWRL DC77 01 READ DC06 01 READER DA15 01 READR DAB2 01 REMCC DA62 01 REMSTX DA59 01 RESTOR DBBA 01 RW DC78 01 RWOK DC84 01 SDDPB DD7B 01 SDXLT DD9B 01 SECTRAN DBFF 01 SELDSK DBC1 01 SENSE 00FF 00 SERD 0003 00 SERS 0002 00 SETDEN E02D 00 SETDMA DBF6 01 SETSEC DBEE 01 SETTRK DBE9 01 STACK E7FF 00 START DA00 01 STATSV DA33 01 STRET DA58 01 SUART DE03 01 TKZERO E009 00 TTYIN DAD5 01 TTYOST DB40 01 TTYOT DB51 01 TTYST DB71 01 USE1 DCE7 01 USE11 DCDE 01 USE2 DCD6 01 USE21 DCCD 01 VIOOUT DAE3 01 VIOXD 0005 00 VIOXS 0004 00 WBOOT DB86 01 WRITE DC25 01 WRTFLG DD4B 01 ZZZ1 DE65 01 ZZZ2 DEF9 01 B>