; ======================================================= ; Supplement to REC containing its library subroutines. ; Additional subroutines, far beyond the tolerance of the ; ASCII alphabet, may be incorporated into REC by placing ; them in this library collection. ; ; The following operators and predicates are found in ; this module: ; ; X call a subroutine with arguments and values ; ; Additionally, this particular module contains the table ; of operators for the graphics subroutines for the Solid ; State Music VB1B board, or the Polymorphic VTI Video ; Terminal Interface. They can also be used with the ; Vector Graphics dense graphic board. ; ; Version prepared for the Summer School, 1980 ; ; RECLIB -- Copyright (C) 1980 ; Universidad Autonoma de Puebla ; All Rights Reserved ; ; [Harold V. McIntosh, 28 August 1980] ; ; 8 July 1983 - x changed, moved to FXT.MAC ; ======================================================= ; EXTERNAL references to subroutines lying in other REC ; modules. ext px,py,ucl,deld,noop ext miuc,mduc,aiuc,oiuc,xiuc,kiuc ext narg ext onel,twol ; Equivalences to entry points in BIOS for both console ; and disk subroutines permitting rapid access to these ; subroutines and even, should such an occasion present ; itself, the writing of a substitute for BDOS in REC. bios equ 0B000H warm equ bios+00H cold equ bios+03H dhom equ bios+18H sdsk equ bios+1BH strk equ bios+1EH ssec equ bios+21H sdma equ bios+24H dire equ bios+27H diwr equ bios+2AH usos equ 0B400H initi equ usos+00H const equ usos+03H conin equ usos+06H conou equ usos+09H listo equ usos+0CH punch equ usos+0FH readr equ usos+12H ; EXTERNAL references to one of the graphics subroutine ; packages. As long as they all use the same names for ; their subroutines, any one of them can be substituted ; for any other by the linking loader L80. ext home,culi,cuex,cure,cuse ext xpl,xmi,ypl,ymi ext blak,whit,reve,cart,line ext ekspl,eksmi,wyepl,wyemi ext ee,ww,nn,ss,kk,ll,hh ext eas,wes,nor,sou ext doli,doex,xppl,xmmi,eksppl,eksmmi ; Pop the top three argumwents off the REC pushdown list ; and place them in the 8080 register pairs. Creating ; them in the order (BC), (DE), (HL) will result in their ; being placed in just the registers indicated. This ; subroutine would be suitable for a FORTRAN call with ; three arguments. thar: call gone call gone call gone pop b pop d pop h ret ; Some REC auxiliaries would prefer to create arguments ; in the order (HL), (DE), (BC). raht: call gone call gone call gone pop h pop d pop b ret ; Others want two arguments in the order (HL), (BC). twrg: call gone call gone pop h pop b ret ; Pop one argument off the REC pushdown list and place it ; in (DE). dear: call gone pop d ret ; Pop one one-byte argument off the REC pushdown list and ; place it in register C. It can also be the low byte of ; a multi-byte argument. carg: lhld px mov c,m jmp ucl ; Pop one argument off the REC pushdown list and then ; transfer it to the 8080 stack. Because of its usage ; of the 8080 instruction xthl, is not ; equivalent to . By the very nature of this ; subroutine it is supposed that it will only be used ; for two-byte arguments, or for the lowest two if there ; are more. gone: lhld px ;fetch pointer to top argument mov e,m ;pick up low byte inx h ;advance pointer mov d,m ;bring in high byte xchg ;place the argument in (HL) xthl ;transfer it to the 8080 stack push h ;but keep the return address jmp ucl ;pop the top argument off the PDL ; Prepare the REC pushdown list to receive a one-byte ; argument, such as might be returned in the accumulator ; after a subroutine call. onby: lxi b,01H jmp narg ; Deposit one byte on the REC pushdown list in the place ; previously prepared, taking it from the accumulator. ston: lhld px mov m,a inx h shld py ret ; Call a subroutine with an argument in (DE). goa:: lhld px call twol pop d ret ; (X) - A subroutine numbered k with n arguments may be ; executed from REC by writing arg1, arg2, ..., argn,k,X. ; It will then leave m results on the pushdown list, ; supposing that provision for m and n have been made if ; forming the library table. libr:: call deld ;load top argument into (DE), pop it mov l,e ;copy it into (HL) mov h,d ; dad h ;multiply it by two dad d ;add it in to get three dad h ;another factor two makes six lxi d,lib ;place base address in (DE) dad d ;add it to displacement mov e,m ;put address at that location in (DE) inx h ;...it is subroutine reporting values mov d,m ; push d ;keep for reference inx h ;next address also goes into (DE) mov e,m ;...it is execution subroutine inx h ; mov d,m ; push d ;keep it too inx h ;load the third address mov e,m ;...it is argument loading subroutine inx h ; mov d,m ; xchg ;this one goes into (HL) pchl ;for immediate execution ; Library table. Each entry, consisting of six bytes, ; has the form in which valu is a ; subroutine which leaves none or more results on the ; pushdown list, subr executes the subroutine, and prep ; loads the 8080's registers from the pushdown list as ; is necessary to transmit arguments to the subroutine. ; Normally prep and valu will be found here in the RECLIB ; module, while subr would have to be declared external ; and be fetched by the linking loader. dw noop,diwr,noop ;write next on disk dw noop,dire,noop ;read next from disk dw noop,sdma,dear ;set DMA address dw noop,ssec,carg ;set sector dw noop,strk,carg ;set track dw noop,sdsk,carg ;set disk unit dw noop,dhom,noop ;home read head dw ston,readr,onby ;paper tape reader dw noop,punch,carg ;paper tape punch dw noop,listo,carg ;printer output dw noop,conou,carg ;console output dw ston,conin,onby ;console input dw ston,const,onby ;console status dw noop,cold,noop ;cold start dw noop,warm,noop ;warm boot dw noop,initi,noop ;general initialization lib: dw noop,miuc,raht ;move by increment until count dw noop,mduc,raht ;move by decrement until count dw noop,aiuc,raht ;and by increment until count dw noop,oiuc,raht ;or by increment until count dw noop,xiuc,raht ;xor by increment until count dw noop,kiuc,twrg ;complement by incr untl count dw 0,0,0 dw 0,0,0 dw 0,0,0 dw 0,0,0 dw noop,home,noop ;home the cursor dw noop,culi,noop ;light pixel at cursor dw noop,cuex,noop ;extinguish cursor dw noop,cure,noop ;reverse cursor dw ston,cuse,onby ;sense cursor dw noop,xpl,noop ;cursor right one pixel dw noop,xmi,noop ;cursor left one pixel dw noop,ypl,noop ;cursor up one pixel dw noop,ymi,noop ;cursor down one pixel dw noop,blak,noop ;make whole screen black dw noop,whit,noop ;make whole screen white dw noop,reve,noop ;reverse whole screen dw noop,cart,dear ;cursor to cart coord dw noop,line,dear ;line given increments dw noop,ekspl,noop ;rotate right one pixel dw noop,eksmi,noop ;rotate left one pixel dw noop,wyepl,noop ;rotate up one pixel dw noop,wyemi,noop ;rotate down one pixel dw noop,ee,noop ;LIFE cursor 2 pix right dw noop,ww,noop ;LIFE cursor 2 pix left dw noop,nn,noop ;life cursor 2 pix up dw noop,ss,noop ;life cursor 2 pix down dw noop,kk,noop ;extinguish life cell dw noop,ll,noop ;illuminate life cell dw noop,hh,noop ;one cycle of LIFE dw noop,eas,noop ;LIFE screen right dw noop,wes,noop ;LIFE screen left dw noop,nor,noop ;LIFE screen up dw noop,sou,noop ;LIFE screen down dw noop,doli,noop ;illuminate 2-pixel dot dw noop,doex,noop ;extinguish 2-pixel dot dw noop,xppl,noop ;fast right 2 pix dw noop,xmmi,noop ;fast left 2 pix dw noop,eksppl,noop ;fast screen right dw noop,eksmmi,noop ;fast screen left end